2017-10-02 96 views
0

ManagementEventWatcherを使用して変更があるたびに、Document、HostPrintQueue、JobId、JobStatus、TotalPagesなどのデータを取得したので、Win32_PrintJob WMIクラスにクエリしています。 。TotalPagesが実際に印刷するページの番号を表していない、現時点ではこれらのデータを取得するにはまだ見えますが、printjobは処理を終了せず、その瞬間に印刷するページ数を変更していますが、番号、どのように印刷ジョブの実際の番号を取得する処理を完了したら?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(); 

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());      
      } 
    } 

答えて

0

WMIはおそらくnot sufficient to do thisある は、ここに私のコードです。

Windowsは確実にページカウント(またはコピーなど)を提供しないため、正確な情報を取得する唯一の方法は、ジョブを一時停止して解析することです。これは簡単な作業ですが、here's a little more infoです。

+0

あなたの答えに感謝します。私はすでにこれのための解決策を見つけました、問題は私が間違った瞬間に印刷ジョブの総ページを求めていたことでした。印刷ジョブのステータスが「印刷中」の場合は、この値を取得する瞬間です。今問題は、私が単語の文書を印刷すると、常に1を表示する風景のdmCopiesの値です。ところで、C#でプリンタの総歴史的なカウントを取得する方法がありますか? – karelp90

+0

Windowsは履歴ページ数情報を保持しません。ハイエンドプリンタは、[SNMP](https://tools.ietf.org/html/rfc3805)でプレイしたい場合に使用します。 –