Gestionnaire des taches d'impression (imprimantes)

Soyez le premier à donner votre avis sur cette source.

Vue 18 677 fois - Téléchargée 1 952 fois

Description

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)

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

cs_leoneo
Messages postés
9
Date d'inscription
dimanche 16 février 2003
Statut
Membre
Dernière intervention
11 juin 2003
-
Bonjour , je programme sous un autre langage Dark Basic et j'aurai besoin d'une DLL me permettant d'imprimer du texte (en couleur , en italique , en gras ...) et d'imprimer des images (couleur) cette DLL pourrait aussi gérer l'impression . Pourriez vous me créer cette DLL , cela serrai utile à des centaines de personnes , Je vous remercie Beaucoup @+Léo
none77
Messages postés
31
Date d'inscription
mardi 7 janvier 2003
Statut
Membre
Dernière intervention
16 juillet 2004
-
Salut ShareVB,
je pense qu'il aurait été de bonne augure de préciser que ce code n'était pas de toi mais d'un site allemand.
Je ne cherche pas la guerre, loin de ca, mais je pense que l'honneteter a du bon. Dans un sens, tu ne dis pas non plus que c'est toi ki la fait ! ;o) donc t'es pas malhonnete non plus...

Mais c'est super sympa d'avoir traduit ce code car super pratique !
Et merci aussi de m'avoir filé l'adresse la dernière fois ;o)
Ciao,
None
alainisfce
Messages postés
13
Date d'inscription
vendredi 5 septembre 2003
Statut
Membre
Dernière intervention
10 février 2005
-
Bonjour,

Grace a vous j'ai enfin trouvez un début de piste pour mon problèmes.
j'ai besoin de récupérer toutes les données des travaux avec comme status "imprimé".
mon spooleur d'impression est configurer pour garder les travaux une fois l'impréssion terminée. En regardant avec le gestionnaire d'impression je les voie les ses travaux mais pas via votre outil??

pourriez vous m'aider?
ShareVB
Messages postés
2717
Date d'inscription
vendredi 28 juin 2002
Statut
Membre
Dernière intervention
13 janvier 2016
10 -
Salut,

je viens de mettre à jour la source : il manquait l'affichage du Status "imprimé" dans la colonne status...
si les taches dejà imprimées n'apparaissent pas cela peut etre dû à un manque d'autorisation (sous NT/2000/XP) pour l'acces au taches d'impression d'un compte ou alors un probleme de spooler

personellement chez moi l'affichage des documents déjà imprimés fonctionne (au moins avant un redémarrage)... avec les droits d'administrateur...
helefkaem
Messages postés
3
Date d'inscription
jeudi 19 juin 2003
Statut
Membre
Dernière intervention
4 septembre 2006
-
Comment faire pour récupérer le nombre de page réellement imprimées par WORD en multicopie (le spooleur annonce uniquement le nombre de page pour 1 exemplaire mais pas le nombre d'exemplaire)

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.