Druckerstatus
13.11.2005 23:12:29
Nepumuk
kann mal eine/einer das kleine Makro testen? Ich habe nur virtuelle Drucker angeschlossen (die anderen sind entweder defekt bzw. die Netzwerkkarte ist im Eimer) und komme darum nicht dahinter, ob bei einem Drucker der Offline bzw. ausgeschaltet ist, ein anderer Status zurückgeliefert wird. Ich bekomme immer nur 0 zurück.
' **********************************************************************
' Modul: Modul1 Typ: Allgemeines Modul
' **********************************************************************
Option Explicit
Private Declare Function lstrcpy Lib "kernel32.dll" Alias "lstrcpyA" ( _
ByVal lpString1 As String, _
ByVal lpString2 As Long) As Long
Private Declare Function lstrlen Lib "kernel32.dll" Alias "lstrlenA" ( _
ByVal lpString As Long) As Long
Private Declare Function EnumPrinters Lib "winspool.drv" Alias "EnumPrintersA" ( _
ByVal flags As Long, _
ByVal name As String, _
ByVal Level As Long, _
ByRef pPrinterEnum As Long, _
ByVal cdBuf As Long, _
ByRef pcbNeeded As Long, _
ByRef pcReturned As Long) As Long
Private Const CCHDEVICENAME = 32
Private Const CCHFORMNAME = 32
Private Type ACL
AclRevision As Byte
Sbz1 As Byte
AclSize As Integer
AceCount As Integer
Sbz2 As Integer
End Type
Private Type SECURITY_DESCRIPTOR
Revision As Byte
Sbz1 As Byte
Control As Long
Owner As Long
Group As Long
Sacl As ACL
Dacl As ACL
End Type
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_INFO_1 '4
flags As Long
pDescription As String
pName As String
pComment As String
End Type
Private Type PRINTER_INFO_2 '21
pServerName As String
pPrinterName As String
pShareName As String
pPortName As String
pDriverName As String
pComment As String
pLocation As String
pDevmode As DEVMODE
pSepFile As String
pPrintProcessor As String
pDatatype As String
pParameters As String
pSecurityDescriptor As SECURITY_DESCRIPTOR
Attributes As Long
Priority As Long
DefaultPriority As Long
StartTime As Long
UntilTime As Long
Status As Long
cJobs As Long
AveragePPM As Long
End Type
Private Type PRINTER_INFO_3 '1
pSecurityDescriptor As SECURITY_DESCRIPTOR
End Type
Private Type PRINTER_INFO_4 '3
pPrinterName As String
pServerName As String
Attributes As Long
End Type
Private Type PRINTER_INFO_5 '5
pPrinterName As String
pPortName As String
Attributes As Long
DeviceNotSelectedTimeout As Long
TransmissionRetryTimeout As Long
End Type
Private Const PRINTER_ENUM_LOCAL = &H2
Public Sub Test()
Dim longbuffer() As Long, printinfo() As PRINTER_INFO_2, numbytes As Long
Dim numneeded As Long, numprinters As Long, c As Integer, RetVal As Long
numbytes = 3076
Redim longbuffer(0 To numbytes / 4) As Long
RetVal = EnumPrinters(PRINTER_ENUM_LOCAL, "", 2, longbuffer(0), numbytes, _
numneeded, numprinters)
If RetVal = 0 Then
numbytes = numneeded
Redim longbuffer(0 To numbytes / 4) As Long
RetVal = EnumPrinters(PRINTER_ENUM_LOCAL, "", 2, longbuffer(0), numbytes, _
numneeded, numprinters)
If RetVal = 0 Then MsgBox "Fehler bei der Druckersuche." & vbLf & _
"Programmabbruch.", 16, "Fehlermeldung": End
End If
If numprinters 0 Then Redim printinfo(0 To numprinters - 1)
For c = 0 To numprinters - 1
printinfo(c).pPrinterName = Space(lstrlen(longbuffer(21 * c + 1)))
RetVal = lstrcpy(printinfo(c).pPrinterName, longbuffer(21 * c + 1))
printinfo(c).Status = longbuffer(21 * c + 18)
Next
For c = 0 To numprinters - 1
MsgBox "Der Status des Druckers: " & printinfo(c).pPrinterName & _
" ist: " & printinfo(c).Status, 64, "Information"
Next
End Sub
Gruß
Nepumuk
' Modul: Modul1 Typ: Allgemeines Modul
' **********************************************************************
Option Explicit
Private Declare Function lstrcpy Lib "kernel32.dll" Alias "lstrcpyA" ( _
ByVal lpString1 As String, _
ByVal lpString2 As Long) As Long
Private Declare Function lstrlen Lib "kernel32.dll" Alias "lstrlenA" ( _
ByVal lpString As Long) As Long
Private Declare Function EnumPrinters Lib "winspool.drv" Alias "EnumPrintersA" ( _
ByVal flags As Long, _
ByVal name As String, _
ByVal Level As Long, _
ByRef pPrinterEnum As Long, _
ByVal cdBuf As Long, _
ByRef pcbNeeded As Long, _
ByRef pcReturned As Long) As Long
Private Const CCHDEVICENAME = 32
Private Const CCHFORMNAME = 32
Private Type ACL
AclRevision As Byte
Sbz1 As Byte
AclSize As Integer
AceCount As Integer
Sbz2 As Integer
End Type
Private Type SECURITY_DESCRIPTOR
Revision As Byte
Sbz1 As Byte
Control As Long
Owner As Long
Group As Long
Sacl As ACL
Dacl As ACL
End Type
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_INFO_1 '4
flags As Long
pDescription As String
pName As String
pComment As String
End Type
Private Type PRINTER_INFO_2 '21
pServerName As String
pPrinterName As String
pShareName As String
pPortName As String
pDriverName As String
pComment As String
pLocation As String
pDevmode As DEVMODE
pSepFile As String
pPrintProcessor As String
pDatatype As String
pParameters As String
pSecurityDescriptor As SECURITY_DESCRIPTOR
Attributes As Long
Priority As Long
DefaultPriority As Long
StartTime As Long
UntilTime As Long
Status As Long
cJobs As Long
AveragePPM As Long
End Type
Private Type PRINTER_INFO_3 '1
pSecurityDescriptor As SECURITY_DESCRIPTOR
End Type
Private Type PRINTER_INFO_4 '3
pPrinterName As String
pServerName As String
Attributes As Long
End Type
Private Type PRINTER_INFO_5 '5
pPrinterName As String
pPortName As String
Attributes As Long
DeviceNotSelectedTimeout As Long
TransmissionRetryTimeout As Long
End Type
Private Const PRINTER_ENUM_LOCAL = &H2
Public Sub Test()
Dim longbuffer() As Long, printinfo() As PRINTER_INFO_2, numbytes As Long
Dim numneeded As Long, numprinters As Long, c As Integer, RetVal As Long
numbytes = 3076
Redim longbuffer(0 To numbytes / 4) As Long
RetVal = EnumPrinters(PRINTER_ENUM_LOCAL, "", 2, longbuffer(0), numbytes, _
numneeded, numprinters)
If RetVal = 0 Then
numbytes = numneeded
Redim longbuffer(0 To numbytes / 4) As Long
RetVal = EnumPrinters(PRINTER_ENUM_LOCAL, "", 2, longbuffer(0), numbytes, _
numneeded, numprinters)
If RetVal = 0 Then MsgBox "Fehler bei der Druckersuche." & vbLf & _
"Programmabbruch.", 16, "Fehlermeldung": End
End If
If numprinters 0 Then Redim printinfo(0 To numprinters - 1)
For c = 0 To numprinters - 1
printinfo(c).pPrinterName = Space(lstrlen(longbuffer(21 * c + 1)))
RetVal = lstrcpy(printinfo(c).pPrinterName, longbuffer(21 * c + 1))
printinfo(c).Status = longbuffer(21 * c + 18)
Next
For c = 0 To numprinters - 1
MsgBox "Der Status des Druckers: " & printinfo(c).pPrinterName & _
" ist: " & printinfo(c).Status, 64, "Information"
Next
End Sub
Gruß
Nepumuk