¿Cómo obtener información de la impresora en .NET?

En PrintDialog estándar hay cuatro valores asociados con una impresora seleccionada: Estado, Tipo, Dónde y Comentario.

Si conozco el nombre de una impresora, ¿cómo puedo obtener estos valores en C # 2.0?

Como sugirió dowski , podría usar WMI para obtener las propiedades de la impresora. El siguiente código muestra todas las propiedades para un nombre de impresora determinado. Entre ellos encontrará: PrinterStatus, Comment, Location, DriverName, PortName, etc.

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); } } 

Esto debería funcionar

 using System.Drawing.Printing; 

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

Después de eso, se pueden leer las diversas propiedades de PrinterSettings.

Tenga en cuenta que ps.isValid() puede ver si la impresora realmente existe.

Editar: Un comentario adicional. Microsoft recomienda utilizar un PrintDocument y modificar sus PrinterSettings en lugar de crear PrinterSettings directamente.

Mira PrinterSettings.InstalledPrinters

Tenga en cuenta que el artículo que dowski y Panos estaban refiriendo a ( MSDN Win32_Printer ) puede ser un poco engañoso.

Me refiero al primer valor de la mayoría de las matrices. algunos comienzan con 1 y algunos comienzan con 0. Por ejemplo, el primer valor de ” ExtendedPrinterStatus ” en la tabla es 1, por lo tanto, su matriz debería ser algo como esto:

 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" }; 

y, por otro lado, el primer valor de ” ErrorState ” en la tabla es 0, por lo tanto, su matriz debería ser algo como esto:

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

Por cierto, ” PrinterState ” está obsoleto, pero puede usar ” PrinterStatus “.

Ha pasado mucho tiempo desde que trabajé en un entorno de Windows, pero sugiero que considere usar WMI .

Solo como referencia, aquí hay una lista de todas las propiedades disponibles para una impresora ManagementObject.

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

Sé que es una publicación antigua, pero hoy en día la opción más fácil / más rápida es utilizar los servicios de impresión mejorados que ofrece el marco WPF (utilizable por aplicaciones que no son de WPF).

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

Un ejemplo para recuperar el estado de la cola de la impresora y el primer trabajo.

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

Como alternativa a WMI puede obtener resultados rápidos y precisos al tocar en WinSpool.drv (es decir, la API de Windows); puede obtener todos los detalles sobre las interfaces, estructuras y constantes de pinvoke.net, o bien, he incluido el código en http://delradiesdev.blogspot.com/2012/02/accessing-printer-status-using-winspool.html