Rubrik: Drucken | 22.03.05 |
EnumJobs-Funktion Diese Funktion ermittelt die aktuell zu druckenden Druckaufträge des Spoolmanagers. | ||
Betriebssystem: Win95, Win98, WinNT 3.1, Win2000, WinME | Views: 8.549 |
Deklaration:
Declare Function EnumJobs Lib "winspool.drv" _ Alias "EnumJobsA" ( _ ByVal hPrinter As Long, _ ByVal FirstJob As Long, _ ByVal NoJobs As Long, _ ByVal Level As Long, _ pJob As Long, _ ByVal cbBuf As Long, _ pcbNeeded As Long, _ pcReturned As Long) As Long
Beschreibung:
Diese Funktion ermittelt die aktuell zu druckenden Druckaufträge des Spoolmanagers.
Parameter:
hPrinter | Erwartet das Handle eines Druckers, der per OpenPrinter-Funktion geöffnet wurde. |
FirstJob | Erwartet den 0-basierenden Index des Druckauftrages, an dem begonnen werden soll zuenumerieren. |
NoJobs | Erwartet die maximale Anzahl an Druckaufträgen, die ermittelt werden sollen. |
Level | Erwartet einen Wert der die Struktur beschreibt, in der die Daten kopiert werden sollen. Wird hier derWert "1" übergeben, werden in den Puffer die Informationen in JOB_INFO_1-Strukturen abgelegt. DerWert "2" legt fest, dass die Daten in JOB_INFO_2-Strukturen in den Puffer kopiert werden. |
pJob | Erwartet einen Puffer der groß genug ist, um alle zu ermittelnde Daten zu empfangen. Alternativ kann hier auch derWert "0" übergeben werden, wenn nur die Größe des benötigten Puffer ermittelt werden soll. |
cbBuf | Erwartet die Größe des Puffers in Bytes. Wurde bei "pJob" derWert "0" übergeben so wird auch hier der Wert "0" erwartet. |
pcbNeeded | Wurde bei "pJob" und "cbBuf" derWert "0" übergeben, so wird diese Variable mit der benötigten Größe des Puffers gefüllt. Andernfalls wird dieseVariable mit der Anzahl der Bytes gefüllt, die in den Puffer kopiert worden sind. |
pcReturned | Diese Variable wird mit der Anzahl der Druckaufträge gefüllt, die in den Puffer kopiert worden sind. |
Rückgabewert:
Ist die Funktion erfolgreich, so liefert sie einen Wert "ungleich 0", andernfalls wird derWert "0" zurückgegeben. Für erweiterte Fehlerinformationen können Sie die GetLastError-Funktion aufrufen.
Beispiel:
Private Declare Function OpenPrinter Lib "winspool.drv" _ Alias "OpenPrinterA" ( _ ByVal pPrinterName As String, _ phPrinter As Long, _ pDefault As Any) As Long Private Declare Function ClosePrinter Lib "winspool.drv" ( _ ByVal hPrinter As Long) As Long Private Declare Function EnumJobs Lib "winspool.drv" _ Alias "EnumJobsA" ( _ ByVal hPrinter As Long, _ ByVal FirstJob As Long, _ ByVal NoJobs As Long, _ ByVal Level As Long, _ pJob As Long, _ ByVal cbBuf As Long, _ pcbNeeded As Long, _ pcReturned As Long) As Long Private Declare Sub MoveMemory Lib "kernel32" _ Alias "RtlMoveMemory" ( _ pDst As Any, _ pSrc As Any, _ ByVal ByteLen As Long) Private Declare Function lstrlen Lib "kernel32" _ Alias "lstrlenA" ( _ ByVal lpString As Any) As Long Private Type DEVMODE dmDeviceName As String * 32 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 * 32 dmUnusedPadding As Integer dmBitsPerPel As Long dmPelsWidth As Long dmPelsHeight As Long dmDisplayFlags As Long dmDisplayFrequency As Long dmICMMethod As Long dmICMIntent As Long dmMediaType As Long dmDitherType As Long dmReserved1 As Long dmReserved2 As Long dmPanningWidth As Long dmPanningHeight As Long End Type Private Type SYSTEMTIME wYear As Integer wMonth As Integer wDayOfWeek As Integer wDay As Integer wHour As Integer wMinute As Integer wSecond As Integer wMilliseconds As Integer End Type Private Type JOB_INFO_2 JobId As Long pPrinterName As String pMachineName As String pUserName As String pDocument As String pNotifyName As String pDatatype As String pPrintProcessor As String pParameters As String pDriverName As String pDevMode As DEVMODE pStatus As String pSecurityDescriptor As Long Status As Long Priority As Long Position As Long StartTime As Long UntilTime As Long TotalPages As Long Size As Long Submitted As SYSTEMTIME Time As Long PagesPrinted As Long End Type ' JOB_INFO_2 Status-Konstanten Private Const JOB_STATUS_BLOCKED_DEVQ = &H200 ' Der Treiber kann die Aktion nicht fortsetzen Private Const JOB_STATUS_DELETED = &H100 ' Der Druckauftrag wurde gelöscht Private Const JOB_STATUS_DELETING = &H4 ' Der Druckauftrag wird gelöscht Private Const JOB_STATUS_ERROR = &H2 ' Ein Fehler ist bei dem Druckauftrag aufgetreten Private Const JOB_STATUS_OFFLINE = &H20 ' Der Ausdruck kann nicht fortgesetzt werden, ' weil der Drucker Offline ist Private Const JOB_STATUS_PAPEROUT = &H40 ' Der Ausdruck kann nicht fortgesetzt werden ' weil kein Papier mehr verfügbar ist Private Const JOB_STATUS_PAUSED = &H1 ' Der Druckauftrag wurde angehalten Private Const JOB_STATUS_PRINTED = &H80 ' Der Druckauftrag wurde gedruckt Private Const JOB_STATUS_PRINTING = &H10 ' Der Druckauftrag wird gedruckt Private Const JOB_STATUS_SPOOLING = &H8 ' Der Druckauftrag wartet in der '"Warteschleife" Private Const JOB_STATUS_USER_INTERVENTION = &H400 ' Der Druckauftrag kann nicht bearbeitet werden, ' weil auf Grund eines Fehlers eine Benutzereingabe ' erforderlich ist ' JOB_INFO_2 Priority-Konstanten Private Const DEF_PRIORITY = 1 ' Standard Priorität Private Const MIN_PRIORITY = 1 ' Minimale Priorität Private Const MAX_PRIORITY = 99 ' Maximale Priorität
' Kopiert einen String anhand eines Pointers in eine String-Variable Private Function CopyStrVar(ByRef StrDest As String, ByRef VarSrc As Long) StrDest = Space(lstrlen(VarSrc)) MoveMemory ByVal StrDest, ByVal VarSrc, Len(StrDest) End Function
' Aktuelle Durcker-Jobs ermitteln Private Sub Command1_Click() Dim Retval As Long, hPrinter As Long, i As Integer Dim Data() As Long, DataLength As Long, JobCount As Long Dim Jobs() As JOB_INFO_2 ' Drucker öffnen Retval = OpenPrinter(Printer.DeviceName, hPrinter, ByVal 0&) ' Benötigte Puffergröße ermitteln Retval = EnumJobs(hPrinter, 0&, 256&, 2&, ByVal 0&, 0&, DataLength, JobCount) If DataLength = 0 And Retval << 0 Then MsgBox "Keine Druckeraufträge vorhanden." Call ClosePrinter(hPrinter) Exit Sub End If ' Daten über die Druckeraufträge ermitteln ReDim Data(DataLength - 1) Retval = EnumJobs(hPrinter, 0&, 256&, 2&, Data(0), DataLength, _ DataLength, JobCount) ' Daten manuell (für jede Variable) in die Struktur kopieren ReDim Jobs(JobCount - 1) For i = 0 To JobCount - 1 With Jobs(i) .JobId = Data(i * 26) CopyStrVar .pPrinterName, Data(i * 26 + 1) CopyStrVar .pMachineName, Data(i * 26 + 2) CopyStrVar .pUserName, Data(i * 26 + 3) CopyStrVar .pDocument, Data(i * 26 + 4) CopyStrVar .pNotifyName, Data(i * 26 + 5) CopyStrVar .pDatatype, Data(i * 3 + 6) CopyStrVar .pPrintProcessor, Data(i * 26 + 7) CopyStrVar .pParameters, Data(i * 26 + 8) CopyStrVar .pDriverName, Data(i * 26 + 9) MoveMemory .pDevMode, ByVal Data(i * 26 + 10), Len(.pDevMode) CopyStrVar .pStatus, Data(i * 26 + 11) .pSecurityDescriptor = Data(i * 26 + 12) .Status = Data(i * 26 + 13) .Priority = Data(i * 26 + 14) .Position = Data(i * 26 + 15) .StartTime = Data(i * 26 + 16) .UntilTime = Data(i * 26 + 17) .TotalPages = Data(i * 26 + 18) .Size = Data(i * 26 + 19) MoveMemory .Submitted, Data(i * 26 + 20), Len(.Submitted) .Time = Data(i * 26 + 24) .PagesPrinted = Data(i * 26 + 25) End With Next i ' Ermittelte Daten ausgeben Debug.Print "Druckaufträge für " & Printer.DeviceName Debug.Print "- - - - - - - - - - - - - - - - - " & vbCrLf For i = 0 To UBound(Jobs) With Jobs(i) Debug.Print "Job-ID: " & .JobId Debug.Print "Datei: " & .pDocument Debug.Print "Anzahl Seiten: " & .TotalPages Debug.Print "Gedruckte Seiten: " & .PagesPrinted With .Submitted Debug.Print "Gesendet: " & .wDay & "." & .wMonth & "." _ & .wYear & _ " " & .wHour & ":" & .wMinute & ":" & .wSecond End With If CBool(.Status And JOB_STATUS_PRINTING) Then Debug.Print "Status: Wird gedruckt" End If If CBool(.Status And JOB_STATUS_SPOOLING) Or .Status = 0 Then Debug.Print "Status: Wartet" End If If CBool(.Status And JOB_STATUS_PAUSED) Then Debug.Print "Status: Angehalten" End If If CBool(.Status And JOB_STATUS_PAPEROUT) Then Debug.Print "Status: Papier ist leer" End If ' ect... Debug.Print vbCrLf End With Next i ' Drucker schließen Retval = ClosePrinter(hPrinter) End Sub