PrintQueue.Refresh不显示打印机的状态

时间:2018-02-19 16:41:50

标签: c# service printing printqueue

我需要运行服务器X的Windows服务来显示所有打印机的状态:缺纸,无碳粉等。 该服务在计算机上运行,​​但当然并非所有打印机都安装在该计算机上。即使打印机安装在机器上,我们也没有打印机的状态!

我唯一能做的就是取出纸张,打印测试页(记事本),现在我可以看到我用下面的代码丢失了纸,但是你可能会这样,这个是不可行的:我不想每10分钟左右向网络的每台打印机发送一个测试页!

我尝试查询PrintQueue.Refresh,但状态未更新,我没有看到打印机托盘已打开(或缺少纸张,或没有碳粉,无论我对打印机做什么。) 顺便说一下,Win32_printer没有给我看一个更好的结果。

注意:

  1. MonitoringWS是可以访问数据库的Web服务。
  2. 打印机是我们要查询的打印机列表。
  3. 这是我尝试做的。

     var printServers = GetListOfPrinterServers();
                var listPrinters = printers as List<Printer> ?? printers.ToList();
                foreach (
                    var printServer in
                        printServers.Select(
                            server => new PrintServer(server, PrintSystemDesiredAccess.EnumerateServer)))
                {
                    printServer.Refresh();
                    var printQueues = printServer.GetPrintQueues();
                    foreach (var printQueue in printQueues)
                    {
                        var queue = printQueue;
                        var printersFound = listPrinters.Where(p =>
                                                                                                                                    string.Equals(p.PrinterName, queue.FullName,
                                                                                 StringComparison.OrdinalIgnoreCase));
                        foreach (var printer in printersFound)
                        {
                            printQueue.Refresh();
    
                            Debug.WriteLine(string.Format("{0} {1}", printQueue.FullName, printQueue.HostingPrintServer.Name) );
                            var pm = new MonitoringWS.PrinterMonitoring
                                         {
                                             FkPrinter = printer.PkPrinter,
                                             QueueStatus = printQueue.QueueStatus,
                                             DriverName = printQueue.QueueDriver.Name,
                                             MonitoringDateTime = DateTime.Now
                                         };
    
                            printerMonitorings.Add(pm);
                        }
                    }
                }
    

1 个答案:

答案 0 :(得分:0)

我找到了一种方法:SNMP。我在http://www.snmpsharpnet.com/使用库SNMP#,我实现了RFC 2790:https://tools.ietf.org/html/rfc2790

有了这个,当打印机支持该标准和SNMP激活时,我得到了打印机的状态(没有碳粉,没有纸张,卡纸等)

感谢大家的帮助。