2017-10-02 2 views
0

Je demande à Win32_PrintJob classe WMI chaque fois qu'il y a un changement avec ManagementEventWatcher, j'ai obtenu des données à ce sujet, telles que: Document, HostPrintQueue, JobId, JobStatus, TotalPages, etc Mais TotalPages ne représente pas le nombre réel de page à imprimer, semble actuellement pour obtenir ces données encore le travail d'impression n'a pas fini de traiter et de décentrer un certain nombre de pages à imprimer dans ce moment mais le total réel est autre Comment obtenir le nombre réel d'un travail d'impression lorsque vous le finissez? Voici mon code:Nombre réel de TotalPages d'un PrintJob (Win32_PrintJob)

ManagementEventWatcher createPrintJobWatcher; 
     String strComputerName = "."; 
     // Create event query to be notified within 1 milli second of a change in a service 
     WqlEventQuery createPrintJobQuery = new WqlEventQuery("SELECT * FROM __InstanceCreationEvent WITHIN 0.001 WHERE TargetInstance ISA \"Win32_PrintJob\""); 

     createPrintJobWatcher = new ManagementEventWatcher(); 
     createPrintJobWatcher.Scope = new ManagementScope("\\\\" + strComputerName + "\\root\\CIMV2"); 
     createPrintJobWatcher.Query = createPrintJobQuery; 
     // times out watcher.WaitForNextEvent in 1 seconds 
     createPrintJobWatcher.Options.Timeout = new TimeSpan(0, 0, 1); 
     //set the print event handler 
     createPrintJobWatcher.EventArrived += new EventArrivedEventHandler(createPrintJobListener); 

     createPrintJobWatcher.Start(); 

     Console.WriteLine("Listening..."); 

     Console.ReadLine(); 

méthode createPrintJobListener:

 static void createPrintJobListener(object sender, EventArrivedEventArgs e) 
    { 

     SelectQuery query = new SelectQuery("Win32_PrintJob"); 
     using (ManagementObjectSearcher searcher = new ManagementObjectSearcher(query)) 
     using (ManagementObjectCollection printJobs = searcher.Get()) 
      foreach (ManagementObject printJob in printJobs) 
      { 
       Console.WriteLine("c1:", printJob); 
       Console.WriteLine("ID: {0}", printJob.GetPropertyValue("JobId").ToString()); 
       Console.WriteLine("name: {0}", printJob.GetPropertyValue("name").ToString()); 
       Console.WriteLine("status: {0}", printJob.GetPropertyValue("status").ToString()); 
       if (printJob.GetPropertyValue("JobStatus") != null) 
       { 
        Console.WriteLine("JobStatus: {0}", printJob.GetPropertyValue("JobStatus").ToString()); 
       } 
       else 
       { 
        Console.WriteLine("JobStatus: NULLLLLL"); 
       } 

       Console.WriteLine("PC: {0}", printJob.GetPropertyValue("HostPrintQueue").ToString()); 
       Console.WriteLine("TOTOAL PAGES: {0}", printJob.GetPropertyValue("TotalPages").ToString());      
      } 
    } 

Répondre

0

WMI est probablement not sufficient to do this.

Windows ne fournit pas de façon fiable le nombre de pages (ou de copies, etc.), la seule façon d'obtenir des informations précises est de mettre le travail en pause et de l'analyser. C'est une tâche non triviale, mais here's a little more info.

+0

merci pour votre réponse. J'ai déjà trouvé la solution pour cela, le problème était que je demandais le nombre total de pages d'impression au mauvais moment. Lorsque le statut du travail d'impression est "Impression", c'est le moment d'obtenir cette valeur, du moins c'est comme cela que cela a fonctionné pour moi. Maintenant, le problème est avec la valeur de dmCopies dans le paysage quand j'imprime un document Word, montre toujours 1. Par ailleurs, il ya un moyen d'obtenir le nombre total historique d'une imprimante avec C#? – karelp90

+0

Windows ne conserve pas les informations de nombre de pages historiques. Les imprimantes haut de gamme le font si vous voulez jouer avec [SNMP] (https://tools.ietf.org/html/rfc3805). –