2008-11-17 20 views

Respuesta

62

Como dowski suggested, puede 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 se encuentran: PrinterStatus, comentario, ubicación, 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); 
    } 
} 
+3

Esto funcionó, pude encontrar y leer todas las propiedades que necesitaba. ¡Gracias! –

+1

en las propiedades de la impresora, estoy utilizando Printer.Properties ["PrinterStatus"]. Value, y me está dando un valor de 2. ¿Cuál es el significado de este valor devuelto, es decir 2? ¿Hay alguna lista donde podamos saber el significado de los valores devueltos? – HotTester

+0

Tengo un escáner hp scanjet 5590, todos los controladores están instalados y está escaneando documentos. Pero cuando uso WMI para obtener el estado del escáner, el WMI no lo detecta. En el panel de control de Win-7, se muestra debajo de los DISPOSITIVOS de la cabeza y no debajo de las IMPRESORAS principales en la sección Dispositivos e impresoras. ¿Cómo obtener el estado del escáner? – HotTester

2

Ha pasado mucho tiempo desde que trabajé en un entorno Windows, pero sugiero que mires a using WMI.

22

Este trabajo debe .

using System.Drawing.Printing; 

...

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

Después de eso, los diferentes properties de PrinterSettings se puede leer.

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 un PrinterSettings directamente.

+0

RU post realmente ayudó. pero también necesito la dirección ipa y el nombre del puerto. cómo obtener la dirección IP y el nombre del puerto para la impresora seleccionada/cargada ...? – Ashutosh

+0

hay una mala manera de hacerlo, usando el método de respuesta seleccionado, da el nombre del servidor para la impresora y si hacemos ping a ese nombre, se resuelve la dirección IP y allí se puede analizar el resultado del ping. Por favor dígame si hay alguna manera mejor de hacerlo – Ashutosh

+0

Uso .Net 4.5, no disponible en .Net 4.5 – AmirhosseinYari

3

Tenga en cuenta que el artículo que Dowski y Panos fue referido a (MSDN Win32_Printer) puede ser un poco engañoso.

Me refiero al primer valor de la mayoría de las matrices. algunos se inicia con 1 y algunas comienza con 0. por ejemplo, "ExtendedPrinterStatus" primer valor en la tabla 1 es, por lo tanto, la matriz debe 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, " ErrorState "primer valor en la tabla es 0, por lo tanto, la matriz debe 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 "es obsoleta, pero se puede utilice "PrinterStatus".

2

Solo como referencia, here es una lista de todas las propiedades disponibles para una impresora ManagementObject.

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

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 impresión y el primer trabajo ..

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

Tanto LocalPrintServer como la cola devuelta por GetPrintQueue son IDisposables, por lo que debería incluir eso en una llamada en uso. using (var lps = new LocalPrintServer()) { usando (var queue = lps.GetPrintQueue (printerName)) { var queueStatus = queue.QueueStatus; var jobStatus = queue.GetPrintJobInfoCollection(). FirstOrDefault(). JobStatus; } } – crunchy

Cuestiones relacionadas