Ce code permet d'obtenir la liste des fichiers en cours d'impression sur toutes les imprimantes installées sur le système.
Il permet de mettre en pause, de faire reprendre,d'annuler, de supprimer et redémarrer un travail d'impression
c'est un peu un clone du spooler windows :) lol
Source / Exemple :
Option Explicit
Private Declare Function ClosePrinter Lib "winspool.drv" _
(ByVal hPrinter As Long) As Long
Private Declare Function OpenPrinter Lib "winspool.drv" Alias _
"OpenPrinterA" (ByVal pPrinterName As String, phPrinter _
As Long, pDefault As Any) 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 cdBuf As Long, pcbNeeded As _
Long, pcReturned As Long) As Long
Private Declare Function SetJob Lib "winspool.drv" Alias _
"SetJobA" (ByVal hPrinter As Long, ByVal JobId As Long, _
ByVal Level As Long, ByRef pJob As JOB_INFO_1, ByVal _
Command As Long) As Long
Private Declare Function PtrToStr Lib "kernel32" Alias _
"lstrcpyA" (ByVal RetVal As String, ByVal Ptr As _
Long) As Long
Private Declare Function StrLen Lib "kernel32" Alias _
"lstrlenA" (ByVal Ptr As Long) As Long
Declare Function FileTimeToLocalFileTime Lib "kernel32" _
(lpFileTime As FILETIME, lpLocalFileTime As FILETIME) As Long
Private Declare Function FileTimeToSystemTime Lib "kernel32" (lpFileTime As FILETIME, lpSystemTime As SYSTEMTIME) As Long
Declare Function SystemTimeToFileTime Lib "kernel32" (lpSystemTime As SYSTEMTIME, lpFileTime As FILETIME) As Long
Private Type FILETIME
dwLowDateTime As Long
dwHighDateTime As Long
End Type
Public 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
Public Type JOB_INFO_1
JobId As Long
pPrinterName As String
pMachineName As String
pUserName As String
pDocument As String
pDatatype As String
pStatus As String
Status As Long
Priority As Long
Position As Long
TotalPages As Long
PagesPrinted As Long
Submitted As SYSTEMTIME
End Type
'Public 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
' LPDEVMODE pDevMode
' pStatus As String
'' PSECURITY_DESCRIPTOR pSecurityDescriptor
' Status As Long
' Priority As String
' Position As String
' StartTime As String
' UntilTime As String
' TotalPages As String
' Size As String
' Submitted As SYSTEMTIME
' Time As Long
' PagesPrinted As Long
'End Type
Public Const JOB_STATUS_PAUSED = &H1
Public Const JOB_STATUS_ERROR = &H2
Public Const JOB_STATUS_DELETING = &H4
Public Const JOB_STATUS_SPOOLING = &H8
Public Const JOB_STATUS_PRINTING = &H10
Public Const JOB_STATUS_OFFLINE = &H20
Public Const JOB_STATUS_PAPEROUT = &H40
Public Const JOB_STATUS_PRINTED = &H80
Public Const JOB_STATUS_USER_INTERVENTION = &H10000
Public Const MAX_PRIORITY = 99
Public Const MIN_PRIORITY = 1
Public Const DEF_PRIORITY = 1
Const JOB_CONTROL_PAUSE = 1
Const JOB_CONTROL_RESUME = 2
Const JOB_CONTROL_CANCEL = 3
Const JOB_CONTROL_RESTART = 4
Const JOB_CONTROL_DELETE = 5
Public Function DisplaySpoolerTask(PrinterName As String) As JOB_INFO_1()
Dim Result As Long, Required As Long, BufLen As Long
Dim Buffer() As Long, Entries As Long, LiMem, FTime As FILETIME
Dim hPrinter As Long, PName As String, l As Long, X As Long, aa As String
Dim Job() As JOB_INFO_1
Const c As Long = 16
BufLen = 1024
ReDim Buffer(BufLen \ 4)
'Ouvrir un acces à l'imprimante
Result = OpenPrinter(ByVal PrinterName, ByVal VarPtr(hPrinter), ByVal 0)
If Result <> 0 Then
'Pas d'erreur
'On cherche la taille du buffer
Result = EnumJobs(hPrinter, 0, &HFFFFFFFF, 1, Buffer(0), _
BufLen, Required, Entries)
If Result = 0 Or Required = 0 Then
'une erreur s'est produite
Call ClosePrinter(hPrinter)
Exit Function
Else
'Est-ce que le buffer est assez gros ?
If Required > BufLen Then
'Buffer pas assez gros
ReDim Buffer(Required \ 4)
Result = EnumJobs(hPrinter, 0, &HFFFFFFFF, 1, Buffer(0), _
BufLen, Required, Entries)
If Result = 0 Then
'Erreur
Call ClosePrinter(hPrinter)
Exit Function
End If
End If
'On ferme l'acces au printer
Call ClosePrinter(hPrinter)
'on prepare la variable local qui stocke les taches
ReDim Job(0 To Entries - 1)
For X = 0 To Entries - 1
'JobID: Buffer(0)
Job(X).JobId = Buffer(c * X + 0)
'Nom de l'imprimante: Buffer(1) pointeur vers une chaine
aa = Space$(StrLen(Buffer(c * X + 1)) + 1)
Call PtrToStr(aa, Buffer(c * X + 1))
aa = Left$(aa, InStr(aa, Chr$(0)) - 1)
Job(X).pPrinterName = aa
'Nom de la machine: Buffer(2) pointeur vers une chaine
aa = Space$(StrLen(Buffer(c * X + 2)) + 1)
Call PtrToStr(aa, Buffer(c * X + 2))
aa = Trim$(Left$(aa, InStr(aa, Chr$(0)) - 1))
Job(X).pMachineName = aa
'Nom de l'utilisateur: Buffer(3) pointeur vers une chaine
aa = Space$(StrLen(Buffer(c * X + 3)) + 1)
Call PtrToStr(aa, Buffer(c * X + 3))
aa = Left$(aa, InStr(aa, Chr$(0)) - 1)
Job(X).pUserName = aa
'Nom du document: Buffer(4) pointeur vers une chaine
aa = Space$(StrLen(Buffer(c * X + 4)) + 1)
Call PtrToStr(aa, Buffer(c * X + 4))
aa = Left$(aa, InStr(aa, Chr$(0)) - 1)
Job(X).pDocument = aa
'Type de date: Buffer(5) pointeur vers une chaine
aa = Space$(StrLen(Buffer(c * X + 5)) + 1)
Call PtrToStr(aa, Buffer(c * X + 5))
aa = Left$(aa, InStr(aa, Chr$(0)) - 1)
Job(X).pDatatype = aa
'Status de la tache: Buffer(6) pointeur vers une chaine
aa = Space$(StrLen(Buffer(c * X + 6)) + 1)
Call PtrToStr(aa, Buffer(c * X + 6))
If InStr(aa, Chr$(0)) <> 0 Then
aa = Left$(aa, InStr(aa, Chr$(0)) - 1)
Else
aa = ""
End If
Job(X).pStatus = aa
'Parametre Status
Job(X).Status = Buffer(c * X + 7)
'Buffer(8) Priority.
Job(X).Priority = Buffer(c * X + 8)
'Position de la tache dans la queue
Job(X).Position = Buffer(c * X + 9)
'Nombre de page de la tache
Job(X).TotalPages = Buffer(c * X + 10)
'Nombre de page déjà imprimée
Job(X).PagesPrinted = Buffer(c * X + 11)
'Date de soumission
With Job(X).Submitted
.wYear = Buffer(c * X + 12) Mod 65536
.wMonth = Buffer(c * X + 12) \ 65536
.wDayOfWeek = Buffer(c * X + 13) Mod 65536
.wDay = Buffer(c * X + 13) \ 65536
.wHour = Buffer(c * X + 14) Mod 65536
.wMinute = Buffer(c * X + 14) \ 65536
.wSecond = Buffer(c * X + 15) Mod 65536
.wMilliseconds = Buffer(c * X + 15) \ 65536
End With
SystemTimeToFileTime Job(X).Submitted, FTime
FileTimeToLocalFileTime FTime, FTime
FileTimeToSystemTime FTime, Job(X).Submitted
Next X
End If
End If
DisplaySpoolerTask = Job
Erase Job
End Function
Public Sub PauseJob(PrinterName As String, Job As JOB_INFO_1)
Dim Result As Long, hPrinter As Long
'Ouvrir un acces à l'imprimante
Result = OpenPrinter(ByVal PrinterName, ByVal VarPtr(hPrinter), ByVal 0)
If Result <> 0 Then
'Pas d'erreur
Call SetJob(hPrinter, Job.JobId, 1&, Job, JOB_CONTROL_PAUSE)
Call ClosePrinter(hPrinter)
End If
End Sub
Public Sub ResumeJob(PrinterName As String, Job As JOB_INFO_1)
Dim Result As Long, hPrinter As Long
'Ouvrir un acces à l'imprimante
Result = OpenPrinter(ByVal PrinterName, ByVal VarPtr(hPrinter), ByVal 0)
If Result <> 0 Then
'Pas d'erreur
Call SetJob(hPrinter, Job.JobId, 1&, Job, JOB_CONTROL_RESUME)
Call ClosePrinter(hPrinter)
End If
End Sub
Public Sub CancelJob(PrinterName As String, Job As JOB_INFO_1)
Dim Result As Long, hPrinter As Long
'Ouvrir un acces à l'imprimante
Result = OpenPrinter(ByVal PrinterName, ByVal VarPtr(hPrinter), ByVal 0)
If Result <> 0 Then
'Pas d'erreur
Call SetJob(hPrinter, Job.JobId, 1&, Job, JOB_CONTROL_CANCEL)
Call ClosePrinter(hPrinter)
End If
End Sub
Public Sub RestartJob(PrinterName As String, Job As JOB_INFO_1)
Dim Result As Long, hPrinter As Long
'Ouvrir un acces à l'imprimante
Result = OpenPrinter(ByVal PrinterName, ByVal VarPtr(hPrinter), ByVal 0)
If Result <> 0 Then
'Pas d'erreur
Call SetJob(hPrinter, Job.JobId, 1&, Job, JOB_CONTROL_RESTART)
Call ClosePrinter(hPrinter)
End If
End Sub
Public Sub DeleteJob(PrinterName As String, Job As JOB_INFO_1)
Dim Result As Long, hPrinter As Long
'Ouvrir un acces à l'imprimante
Result = OpenPrinter(ByVal PrinterName, ByVal VarPtr(hPrinter), ByVal 0)
If Result <> 0 Then
'Pas d'erreur
Call SetJob(hPrinter, Job.JobId, 1&, Job, JOB_CONTROL_DELETE)
Call ClosePrinter(hPrinter)
End If
End Sub
Public Function ConvertStatusToString(Flag As Long) As String
Dim Temp As String
If Flag And JOB_STATUS_PAUSED Then Temp = "Pause "
If Flag And JOB_STATUS_ERROR Then Temp = Temp & "Erreur "
If Flag And JOB_STATUS_DELETING Then Temp = Temp & "Suppression "
If Flag And JOB_STATUS_SPOOLING Then Temp = Temp & "Spool "
If Flag And JOB_STATUS_PRINTING Then Temp = Temp & "Impression "
If Flag And JOB_STATUS_OFFLINE Then Temp = Temp & "Déconnectée "
If Flag And JOB_STATUS_PAPEROUT Then Temp = Temp & "Plus de papier "
If Flag And JOB_STATUS_PRINTED Then temp = temp & "Imprimé "
If Flag And JOB_STATUS_USER_INTERVENTION Then Temp = Temp & "Intervention"
ConvertStatusToString = Trim$(Temp)
End Function
Conclusion :
Marche sous XP au moins (je n'ai pas testé sur 9x/NT/2000)
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.