c#打印机属性WMI

你好我有这个代码来检索打印机属性:

string printerName = "PrinterName"; string query = string.Format("SELECT * from Win32_Printer " + "WHERE Name LIKE '%{0}'", printerName); ManagementObjectSearcher searcher = new ManagementObjectSearcher(query); ManagementObjectCollection coll = searcher.Get(); foreach (ManagementObject printer in coll) { foreach (PropertyData property in printer.Properties) { Console.WriteLine(string.Format("{0}: {1}", property.Name, property.Value)); } } 

但我需要的属性总是返回相同的:

PrinterState:0

PrinterStatus:3

基本上我需要这个来检查打印机是否缺纸。 我认为会是:PrinterState:4

在wxp-86和w7-64上测试返回相同的.Net 4.0

谢谢。

根据msdn , Paper Out = 5

 using System; using System.Management; using System.Windows.Forms; namespace WMISample { public class MyWMIQuery { public static void Main() { try { string printerName = "PrinterName"; ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_Printer " + "WHERE Name LIKE '%{0}'", printerName);); foreach (ManagementObject queryObj in searcher.Get()) { Console.WriteLine("-----------------------------------"); Console.WriteLine("Win32_Printer instance"); Console.WriteLine("-----------------------------------"); Console.WriteLine("PrinterStatus: {0}", queryObj["PrinterStatus"]); } } catch (ManagementException e) { MessageBox.Show("An error occurred while querying for WMI data: " + e.Message); } } } } 

我也有这个问题,并没有简单的解决方法。

问题的原因是Windows Management Instrumentation(WMI)从spoolsv.exe进程检索打印机信息。 因此,检索信息的可靠性完全取决于打印机驱动程序。 您正在查询信息的打印机驱动程序可能绕过假脱机程序以获取状态,或者它不会将状态报告给假脱机程序进程。

Win32_Printer将报告假脱机程序中包含的任何状态。 因此,如果假脱机程序报告Ready,则它永远不会收到状态更改的数据,因为默认值为ReadyWin32_Printer只是将其导出为Idle (PrinterStatus = 3或PrinterState = 0)。

这一行:

 string query = string.Format("SELECT * from Win32_Printer " + "WHERE Name LIKE '%{0}'", printerName); 

尝试在printername之后使用%调用它:

 string query = string.Format("SELECT * from Win32_Printer " + "WHERE Name LIKE '%{0}%'", printerName); 

通常打印机名称是:“[printername] On [port]”