【问题标题】:Printer showing as Idle when queried via Win32_Printer, depsite being Offline通过 Win32_Printer 查询时打印机显示为空闲,尽管处于脱机状态
【发布时间】:2020-11-16 12:49:27
【问题描述】:

我希望通过使用 ManagementObjectSearcher 查询 Win32_Printer 来获取特定打印机的状态。我的代码如下:

using (var searcher = new ManagementObjectSearcher($"SELECT * FROM Win32_Printer WHERE Name LIKE '{printerName}'"))
{
    using (ManagementObjectCollection coll = searcher.Get())
    {
        foreach (ManagementObject printer in coll)
        {
            var status = printer.Properties["PrinterStatus"].Value.ToString();
            var extendedPrinterStatus = printer.Properties["ExtendedPrinterStatus"].Value.ToString();
            var printerState = printer.Properties["PrinterState"].Value.ToString();

            Console.WriteLine(status); // 3 (Idle)
            Console.WriteLine(printerState); // 0 (Idle)
            Console.WriteLine(extendedPrinterStatus); // 2 (Unknown)

            return status == "3";
        }
    }
}

无论打印机是否连接,PrinterStatusExtendedPrinterStatusPrinterState的值保持不变。打印机断开连接后,在 Windows 中的打印机和扫描仪下显示为脱机。

知道我做错了什么吗?我想不通!

谢谢

【问题讨论】:

  • 没什么。您只会得到打印驱动程序支持的内容。可能有新版本的打印驱动程序。当打印机离线时,它正在写入状态,而不是在打印时。
  • @jdweng 谢谢,您知道Windows 打印机和扫描仪 窗口是如何准确判断打印机是否已连接的吗?
  • 不确定。当您有以太网 TCP 连接时,您可以实现 Keep-Alive,其中打印机会定期向服务器发送消息,当消息停止时,服务器可以报告打印机离线。不确定您的打印机是否是这样工作的。
  • 它是 USB,Windows 在连接/未连接时告诉我没有问题,但查询 Win32_Printer 给我的状态不正确
  • 检查设备管理器以查看您是否在使用供应商 USB 驱动程序。标准的 Microsoft USB 驱动程序不会提供与供应商驱动程序相同的状态。

标签: c# winapi printing


【解决方案1】:

无论打印机是否连接,PrinterStatus、ExtendedPrinterStatus 和 PrinterState 的值都保持不变。

如果您正在检索 PrinterStatus = 3 或 PrinterState = 0,则 打印机驱动程序可能无法将准确的信息输入 WMI。 WMI 从 spoolsv.exe 进程中检索打印机信息。这是 打印机驱动程序可能不会向后台处理程序报告其状态。 在这种情况下,Win32_Printer 将打印机报告为空闲。

参考:Win32_Printer class Remarks

您知道 Windows 打印机和扫描仪窗口如何准确判断打印机是否已连接吗?

如果你想determine the state of a physical printer

有一个基本前提必须为真才能确定 物理打印机的状态:Spooler 必须尝试发送 打印作业到物理打印机。这是唯一一次的状态 打印机由端口监视器报告。此外,最 有意义的信息可能会在状态成员中报告 该特定打印作业的 JOB_INFO 结构,因为某些端口 监视器将直接设置这些值。

JOB_INFO 结构包含一个 Status 成员和一个 pStatus 成员。 两个成员都包含由 端口监视器。

Sample Code

顺便说一句,在 Win32_Printer 类中,PrinterState 已弃用。

【讨论】:

  • 感谢您的回答,我最终查询了连接的 USB 设备列表并以这种方式查找打印机,将查看示例代码
  • @JMK EnumPrintersPRINTER_ENUM_LOCAL 参数可以列出本地打印机。
  • @JMK 你好,如果回答对你有用,别忘了采纳哦:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-09
  • 2017-10-31
  • 2012-01-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多