如何在.NET中获取打印机信息?

在标准的PrintDialog中,有四个与选定打印机相关的值:状态,types,位置和注释。

如果我知道一个打印机的名字,我怎样才能在C#2.0中获得这些值?

如dowskibuild议的那样 ,您可以使用WMI来获取打印机属性。 以下代码显示给定打印机名称的所有属性。 其中你会发现:PrinterStatus,Comment,Location,DriverName,PortName等

using System.Management; 

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

应该工作。

 using System.Drawing.Printing; 

 PrinterSettings ps = new PrinterSettings(); ps.PrinterName = "The printer name"; // Load the appropriate printer's setting 

之后,可以读取PrinterSettings的各种属性 。

请注意, ps.isValid()可以查看打印机是否真正存在。

编辑:一个额外的评论。 Microsoftbuild议您使用PrintDocument并修改它的PrinterSettings,而不是直接创buildPrinterSettings。

看看PrinterSettings.InstalledPrinters

请注意, dowskiPanos正在使用的文章( MSDN Win32_Printer )可能有点误导。

我指的是大部分数组的第一个值。 一些以1开始,一些以0开始。例如,表中的“ ExtendedPrinterStatus ”第一个值是1,因此,您的数组应该是这样的:

 string[] arrExtendedPrinterStatus = { "","Other", "Unknown", "Idle", "Printing", "Warming Up", "Stopped Printing", "Offline", "Paused", "Error", "Busy", "Not Available", "Waiting", "Processing", "Initialization", "Power Save", "Pending Deletion", "I/O Active", "Manual Feed" }; 

另一方面,表中的“ ErrorState ”第一个值是0,因此,你的数组应该是这样的:

 string[] arrErrorState = { "Unknown", "Other", "No Error", "Low Paper", "No Paper", "Low Toner", "No Toner", "Door Open", "Jammed", "Offline", "Service Requested", "Output Bin Full" }; 

顺便说一句,“ PrinterState ”已过时,但可以使用“ PrinterStatus ”。

我在Windows环境下工作了很长时间,但是我build议你看看使用WMI 。

仅供参考,以下列出了打印机ManagementObject的所有可用属性。

 usage: printer.Properties["PropName"].Value 

我知道这是一个旧的发布,但现在更容易/更快的select是使用由WPF框架提供的增强打印服务(可用于非WPF应用程序)。

http://msdn.microsoft.com/en-us/library/System.Printing(v=vs.110).aspx

检索打印机队列和第一个工作状态的示例

 var queue = new LocalPrintServer().GetPrintQueue("Printer Name"); var queueStatus = queue.QueueStatus; var jobStatus = queue.GetPrintJobInfoCollection().FirstOrDefault().JobStatus 

作为WMI的替代方法,您可以通过点击WinSpool.drv(即Windows API)来获得快速准确的结果 – 您可以从pinvoke.net获得所有关于接口,结构和常量的详细信息,或者将代码放在一起在http://delradiesdev.blogspot.com/2012/02/accessing-printer-status-using-winspool.html