PrintQueue.Refresh不显示打印机状态

问题描述 投票:0回答:1

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

我唯一能做的就是取出纸张,打印测试页(记事本),现在我可以看到我缺少带有以下代码的纸张,但正如您可能会想到的那样,这是不可行的:我不想每隔 10 分钟左右向网络中的每台打印机发送测试页!

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

注意:

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

这就是我尝试做的。

 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);
                    }
                }
            }
c# service printing printqueue
1个回答
0
投票

我找到了一个办法:SNMP。我使用库 SNMP#NET 并实现 RFC 2790:https://www.rfc-editor.org/rfc/rfc2790 .

这样,当打印机支持该标准并且 SNMP 处于活动状态时,我就可以获得打印机的状态(无碳粉、无纸、卡纸等)

谢谢大家的帮助。

© www.soinside.com 2019 - 2024. All rights reserved.