【发布时间】: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";
}
}
}
无论打印机是否连接,PrinterStatus、ExtendedPrinterStatus和PrinterState的值保持不变。打印机断开连接后,在 Windows 中的打印机和扫描仪下显示为脱机。
知道我做错了什么吗?我想不通!
谢谢
【问题讨论】:
-
没什么。您只会得到打印驱动程序支持的内容。可能有新版本的打印驱动程序。当打印机离线时,它正在写入状态,而不是在打印时。
-
@jdweng 谢谢,您知道Windows 打印机和扫描仪 窗口是如何准确判断打印机是否已连接的吗?
-
不确定。当您有以太网 TCP 连接时,您可以实现 Keep-Alive,其中打印机会定期向服务器发送消息,当消息停止时,服务器可以报告打印机离线。不确定您的打印机是否是这样工作的。
-
它是 USB,Windows 在连接/未连接时告诉我没有问题,但查询 Win32_Printer 给我的状态不正确
-
检查设备管理器以查看您是否在使用供应商 USB 驱动程序。标准的 Microsoft USB 驱动程序不会提供与供应商驱动程序相同的状态。