esr
New Member
Posts: 22
|
Post by esr on Jul 9, 2022 18:06:55 GMT 1
Hallo GFA Fans,
wer kann helfen? - Ich suche eine zuverlässige Routine worüber der Druckerstatus zuverlässig abgefragt werden kann. => Drucker ist ONLINE / OFFLINE. Die Routine soll auch für Netzwerkdrucker funktionieren!
Hat eventuell jemand von Euch eine Lösung hierzu?
Ich habe zwar ein Programmbeispiel gefunden, dieses läuft aber irgendwie nicht?!
------------------------------------------
Local WMIobj As Object, Item As Variant, z% : Set WMIobj = GetObject("winmgmts:")
For Each Item In WMIobj.ExecQuery("SELECT * FROM Win32_Printer" & " WHERE (Name = '" & Printer.DeviceName & "')") z = Item.WorkOffline 'z=-1 bei Drucker ausgeschaltet oder keine USB-Verbindung, sonst 0 Next : Set WMIobj = Nothing //Message z
If z Then Message"Drucker ist ausgeschaltet oder hat keine USB-Verbindung" //: Exit Sub ------------------------------------------ 'jetzt drucken.
Leider kommt hier immer 0 für z als Ergebnis raus?!
Printer.Device.Name habe ich durch den Druckernamen ersetzt!
Über eine Rückmeldung würde ich mich sehr freuen.
Vielen Dank für die Unterstützung.
Gruß ESR
|
|
|
Post by (X) on Jul 9, 2022 18:09:01 GMT 1
|
|
|
Post by (X) on Jul 9, 2022 18:13:33 GMT 1
Private Const CCHDEVICENAME = 32 Private Const CCHFORMNAME = 32 Private Type DEVMODE dmDeviceName As String * CCHDEVICENAME dmSpecVersion As Integer dmDriverVersion As Integer dmSize As Integer dmDriverExtra As Integer dmFields As Long dmOrientation As Integer dmPaperSize As Integer dmPaperLength As Integer dmPaperWidth As Integer dmScale As Integer dmCopies As Integer dmDefaultSource As Integer dmPrintQuality As Integer dmColor As Integer dmDuplex As Integer dmYResolution As Integer dmTTOption As Integer dmCollate As Integer dmFormName As String * CCHFORMNAME dmUnusedPadding As Integer dmBitsPerPel As Integer dmPelsWidth As Long dmPelsHeight As Long dmDisplayFlags As Long dmDisplayFrequency As Long End Type Private Type PRINTER_DEFAULTS pDatatype As String pDevMode As DEVMODE DesiredAccess As Long End Type Public Enum Printer_Status PRINTER_STATUS_READY = &H0 PRINTER_STATUS_PAUSED = &H1 PRINTER_STATUS_ERROR = &H2 PRINTER_STATUS_PENDING_DELETION = &H4 PRINTER_STATUS_PAPER_JAM = &H8 PRINTER_STATUS_PAPER_OUT = &H10 PRINTER_STATUS_MANUAL_FEED = &H20 PRINTER_STATUS_PAPER_PROBLEM = &H40 PRINTER_STATUS_OFFLINE = &H80 PRINTER_STATUS_IO_ACTIVE = &H100 PRINTER_STATUS_BUSY = &H200 PRINTER_STATUS_PRINTING = &H400 PRINTER_STATUS_OUTPUT_BIN_FULL = &H800 PRINTER_STATUS_NOT_AVAILABLE = &H1000 PRINTER_STATUS_WAITING = &H2000 PRINTER_STATUS_PROCESSING = &H4000 PRINTER_STATUS_INITIALIZING = &H8000 PRINTER_STATUS_WARMING_UP = &H10000 PRINTER_STATUS_TONER_LOW = &H20000 PRINTER_STATUS_NO_TONER = &H40000 PRINTER_STATUS_PAGE_PUNT = &H80000 PRINTER_STATUS_USER_INTERVENTION = &H100000 PRINTER_STATUS_OUT_OF_MEMORY = &H200000 PRINTER_STATUS_DOOR_OPEN = &H400000 PRINTER_STATUS_SERVER_UNKNOWN = &H800000 PRINTER_STATUS_POWER_SAVE = &H1000000 End Enum Private Declare Function OpenPrinter Lib "winspool.drv" Alias "OpenPrinterA" (ByVal pPrinterName As String, phPrinter As Long, pDefault As PRINTER_DEFAULTS) As Long Private Declare Function GetPrinter Lib "winspool.drv" Alias "GetPrinterA" (ByVal hPrinter As Long, ByVal Level As Long, buffer As Long, ByVal pbSize As Long, pbSizeNeeded As Long) As Long Private Declare Function ClosePrinter Lib "winspool.drv" (ByVal hPrinter As Long) As Long Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long) Private Declare Function IsBadStringPtrByLong Lib "kernel32" Alias "IsBadStringPtrA" (ByVal lpsz As Long, ByVal ucchMax As Long) As Long Private Sub Form_Load() Dim SizeNeeded As Long, buffer() As Long Dim pDef As PRINTER_DEFAULTS 'Get a handle to the printer lret = OpenPrinter(Printer.DeviceName, mhPrinter, pDef) 'Initialize the buffer ReDim Preserve buffer(0 To 0) As Long 'Retrieve the required size (in bytes) lret = GetPrinter(mhPrinter, 2, buffer(0), UBound(buffer), SizeNeeded) 'Resize the buffer... Note that a Long is four bytes ReDim Preserve buffer(0 To (SizeNeeded / 4) + 3) As Long 'Retrieve the Printer information lret = GetPrinter(mhPrinter, 2, buffer(0), UBound(buffer) * 4, SizeNeeded) 'The data stored in 'buffer' corresponds with the data of a PRINTER_INFO_2 structure ClosePrinter mhPrinter 'Show the data PrintData "status ", GetPrinterStatus((buffer(18))) Unload Me End Sub Sub PrintData(Name As String, Data As String) If LenB(Data) > 0 Then Debug.Print Name + ": " + Data End If End Sub Private Function GetPrinterStatus(lngStatus As Long) As String Select Case lngStatus Case Printer_Status.PRINTER_STATUS_BUSY MsgBox "busy" Case Printer_Status.PRINTER_STATUS_DOOR_OPEN MsgBox "door open" Case Printer_Status.PRINTER_STATUS_ERROR MsgBox "error" Case Printer_Status.PRINTER_STATUS_INITIALIZING MsgBox "initialising" Case Printer_Status.PRINTER_STATUS_IO_ACTIVE MsgBox "io active" Case Printer_Status.PRINTER_STATUS_MANUAL_FEED MsgBox "manual feed" Case Printer_Status.PRINTER_STATUS_NO_TONER 'and many more you can add Case Printer_Status.PRINTER_STATUS_PAUSED Case Printer_Status.PRINTER_STATUS_READY MsgBox "ready" End Select End Function
|
|