2017-10-02 7 views
0

ManagementEventWatcher를 사용하여 변경 사항이있을 때마다 Win32_PrintJob WMI 클래스에 쿼리 할 때 문서, HostPrintQueue, JobId, JobStatus, TotalPages 등과 같은 데이터를 가져 왔습니다. . TotalPages가 실제 페이지 번호 인을 표시하지 않고 있습니다.이 데이터를 얻기 위해 순간적으로 인쇄 작업이 처리되지 않고 그 순간에 인쇄 할 여러 페이지를 양도하지만 실제 총계는 다른 것입니다. 번호, 처리가 끝나면 실제 인쇄 작업 수를 얻는 방법?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

답변 해 주셔서 감사합니다. 나는이 문제에 대한 해결책을 이미 찾았는데, 문제는 잘못된 순간에 인쇄 작업의 총 페이지 수를 묻는 것이 었습니다. 인쇄 작업 상태가 "인쇄 중"인 경우이 값을 얻는 순간입니다. 적어도 그것이 저에게 효과적이었습니다. 이제 문제는 dmCopies 값으로 풍경에있는 단어 문서를 인쇄 할 때 항상 1을 표시하는 것입니다. 그런데 C#으로 프린터의 총 기록 개수를 얻는 방법이 있습니까? – karelp90

+0

Windows는 기록 페이지 수 정보를 보관하지 않습니다. 하이 엔드 프린터는 [SNMP] (https://tools.ietf.org/html/rfc3805)로 게임을하고 싶습니다. –