2011-02-15 110 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; 

这绝不是一个全面的列表,并记住,这是可能的队列中有一个或多个这样的状态,所以你得想想,你处理的顺序。