2011-02-15 111 views
11

在我的應用程序(Windows 7,VS2010)中,我必須在成功打印圖像後減少信用計數器。 無論如何,在開始整個過程​​之前,我想了解一下打印機的狀態,以便在出紙,卡紙等情況下提醒用戶。 現在,環顧四周,我發現了幾個使用Windows WMI的例子,但是......從來沒有用過。例如,使用THIS片段,如果我取出紙張,打開蓋板,則關閉打印機,打印機狀態始終處於準備就緒狀態。c#檢查打印機狀態

現在打印機的狀態總是很好,我從辦公室測試在家中舒適地關閉的打印機。 有我通過炸藥引爆設備,以便有打印機錯誤狀態?

這是 'PRINTERNAME' 被接收爲參數,我用

ManagementObjectCollection MgmtCollection; 
ManagementObjectSearcher MgmtSearcher; 

//Perform the search for printers and return the listing as a collection 
MgmtSearcher = new ManagementObjectSearcher("Select * from Win32_Printer"); 
MgmtCollection = MgmtSearcher.Get(); 

foreach (ManagementObject objWMI in MgmtCollection) 
{ 

    string name = objWMI["Name"].ToString().ToLower(); 

    if (name.Equals(printerName.ToLower())) 
    { 

     int state = Int32.Parse(objWMI["ExtendedPrinterStatus"].ToString()); 
     if ((state == 1) || //Other 
     (state == 2) || //Unknown 
     (state == 7) || //Offline 
     (state == 9) || //error 
     (state == 11) //Not Available 
     ) 
     { 
     throw new ApplicationException("hope you are finally offline"); 
     } 

     state = Int32.Parse(objWMI["DetectedErrorState"].ToString()); 
     if (state != 2) //No error 
     { 
     throw new ApplicationException("hope you are finally offline"); 
     } 

    } 

} 

的代碼。

謝謝你的建議。

+2

當你發現某些有用的東西時,記住你必須應付所有這些情況出現*因爲*你也打印 - 炸藥可能會在檢查狀態和實際開始打印作業之間關閉。 – 2011-02-15 09:52:19

+2

可以怪WMI。大多數打印機驅動程序不會正確更新打印機狀態以供WMI選擇。我們遇到過不同的問題 – 2011-02-15 10:28:14

+0

你在看什麼打印機? – 2011-05-09 16:15:48

回答

9

你不會說你正在使用什麼版本的.Net,但是自從.Net 3.0以來,有一些很好的打印功能。我已經使用了這個功能,雖然我無法確定它會報告各種狀態級別,但我已經看到諸如各種打印機的「Toner Low」等消息。

PrinterDescription是一個自定義類,但你可以看到它使用的屬性。

http://msdn.microsoft.com/en-us/library/system.printing.aspx

 PrintQueueCollection printQueues = null; 
     List<PrinterDescription> printerDescriptions = null; 

     // Get a list of available printers. 
     this.printServer = new PrintServer(); 
     printQueues = this.printServer.GetPrintQueues(new[] { EnumeratedPrintQueueTypes.Local, EnumeratedPrintQueueTypes.Connections }); 
     printerDescriptions = new List<PrinterDescription>(); 

     foreach (PrintQueue printQueue in printQueues) 
     { 
      // The OneNote printer driver causes crashes in 64bit OSes so for now just don't include it. 
      // Also redirected printer drivers cause crashes for some printers. Another WPF issue that cannot be worked around. 
      if (printQueue.Name.ToUpperInvariant().Contains("ONENOTE") || printQueue.Name.ToUpperInvariant().Contains("REDIRECTED")) 
      { 
       continue; 
      } 

      string status = printQueue.QueueStatus.ToString(); 

      try 
      { 
       PrinterDescription printerDescription = new PrinterDescription() 
       { 
        Name = printQueue.Name, 
        FullName = printQueue.FullName, 
        Status = status == Strings.Printing_PrinterStatus_NoneTxt ? Strings.Printing_PrinterStatus_ReadyTxt : status, 
        ClientPrintSchemaVersion = printQueue.ClientPrintSchemaVersion, 
        DefaultPrintTicket = printQueue.DefaultPrintTicket, 
        PrintCapabilities = printQueue.GetPrintCapabilities(), 
        PrintQueue = printQueue 
       }; 

       printerDescriptions.Add(printerDescription); 
      } 
      catch (PrintQueueException ex) 
      { 
       // ... Logging removed 
      } 
     } 
0

這是所有品牌的打印機可靠的唯一的解決辦法是使用SNMP來查詢打印的頁數,並確保它的發送文檔中的頁面數相匹配。

SNMP OID的頁數是1.3.6.1.2.1.43.10.2.1.4

從我的測試中,(多次讀取的打印隊列時奇數空引用除外)所有其他策略已不可靠行爲或提供不準確的狀態代碼或頁數。

7

System.Printing命名空間中的PrintQueue類是您所追求的。它有許多屬性可以提供有關它所代表的打印機狀態的有用信息。這裏有些例子;

 var server = new LocalPrintServer(); 

     PrintQueue queue = server.DefaultPrintQueue; 

     //various properties of printQueue 
     var isOffLine = queue.IsOffline; 
     var isPaperJam = queue.IsPaperJammed; 
     var requiresUser = queue.NeedUserIntervention; 
     var hasPaperProblem = queue.HasPaperProblem; 
     var isBusy = queue.IsBusy; 

這絕不是一個全面的列表,並記住,這是可能的隊列中有一個或多個這樣的狀態,所以你得想想,你處理的順序。