2010-11-23 1 views
3

PrintQueue 개체에 포함 된 인쇄 큐 상태 정보를 업데이트하는 방법이 있습니까?System.Printing.PrintQueue QueueStatus가 업데이트되지 않습니다.

PrintQueue 개체에서 Refresh을 호출 해 보았습니다.하지만 실제로 아무 것도하지 않습니다. 예를 들어 프린터를 끄고 제어판에서 프린터를 "오프라인"으로 올바르게 표시하지만, QueueStatus 속성과 IsOffline 속성은 반영하지 않습니다. 몇 번이나 새로 고침을 호출해도 PrintServer 및 해당 PrintQueue

WMI 쿼리를 사용하여 상태 정보를 얻는 방법에 대한 예제를 보았습니다.하지만 이러한 속성을 PrintQueue 개체에서 사용할 수 있으므로 이러한 메서드를 사용할 수 있는지 여부가 궁금합니다.

+0

이 WPF는 어떻게 관련이 있습니까? – benPearce

+0

안녕하세요,이 문제에 대한 해결책을 찾을 수 있었습니까? 나는 그것을 또한 직면했다. – rem

+0

@rem - 아니요, 불행히도 이러한 속성을 작동시키는 방법을 찾지 못했습니다. 결국 내 생각에 포기했다. 애플의 상태를 표시하는 것이 문제가되지 않았기 때문이다. 대답을 찾으면 여기에 게시하십시오! –

답변

0

PrintDocument (System.Drawing.Printing)를 인쇄하려고하면 printjobs의 상태를 확인하십시오.

첫 번째 단계 : printDocument를 초기화하십시오.

두 번째 단계 : System.Drawing.Printing.PrinterSettings.InstalledPrinters.Cast<string>();

에서 프린터 이름을 가져 그리고 당신의 printerDocument.PrinterSettings.PrinterName

세 번째 단계에 복사 : 인쇄 및 처분하려고합니다.

printerDocument.Print(); 
printerDocument.Dispose(); 

마지막 단계 : 작업 (UI 스레드를 차단하지 않음)에서 검사를 실행하십시오.

 private bool IsPrinterOk(string name,int checkTimeInMillisec) 
     { 
      System.Collections.IList value = null; 
      do 
      { 
       //checkTimeInMillisec should be between 2000 and 5000 
       System.Threading.Thread.Sleep(checkTimeInMillisec); 

       using (System.Management.ManagementObjectSearcher searcher = new System.Management.ManagementObjectSearcher("SELECT * FROM Win32_PrintJob WHERE Name like '%" + name + "%'")) 
       { 
        value = null; 

        if (searcher.Get().Count == 0) // Number of pending document. 
         return true; // return because we haven't got any pending document. 
        else 
        { 
         foreach (System.Management.ManagementObject printer in searcher.Get()) 
         { 
          value = printer.Properties.Cast<System.Management.PropertyData>().Where(p => p.Name.Equals("Status")).Select(p => p.Value).ToList(); 
          break; 
         } 
        } 
       } 
      } 
      while (value.Contains("Printing") || value.Contains("UNKNOWN") || value.Contains("OK")); 

      return value.Contains("Error") ? false : true;  
     } 

행운을 빕니다 : 여기

Task.Run(()=>{ 
    if (!IsPrinterOk(printerDocument.PrinterSettings.PrinterName,checkTimeInMillisec)) 
    { 
     // failed printing, do something... 
    } 
    }); 

의 구현입니다.

+0

질문은 새로운 System.Printing.PrintQueue 개체에 관한 것입니다. 귀하의 대답은 이전 System.Drawing.Printing ... 개체에 관한 것입니다. 시간을내어 여기에 추가해 주셔서 감사하지만 질문에 답변하지 않습니다. –

+0

PrintQueue도 사용하려고했습니다. printQueue 인스턴스와 마찬가지로 (인쇄를 시도한 후) 동일한 작업을 수행 할 수 있습니다 ( 주기로). pq.QueueStatus를 얻을 수 있으며 실패한 인쇄 후에 PrintQueueStatus.Error 값과 함께 반환됩니다. 나는이 방법을 너무 시도했다. 그러나 나는 내 대답이'printQueue.QueueStatus'보다 더 신뢰할만한 해결책이라는 것을 경험했다. –

+0

그래서 인쇄 대기열의 상태를 얻기 전에 실제로 인쇄를 시도해야 할까? 그것은 사용자에게는 다소 문제가 될 것입니다. 그렇죠? 아니면 잘못 읽었습니까? –