Pregunta

En el 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?

¿Fue útil?

Solución

Como dowski sugirió , puede usar WMI para obtener propiedades de la impresora. El siguiente código muestra todas las propiedades para un nombre de impresora dado. Entre ellos encontrará: Estado de impresora, Comentario, Ubicación, Nombre del controlador, Nombre del puerto, 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);
    }
}

Otros consejos

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, los diversos las propiedades de PrinterSettings se pueden leer.

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

Editar: un comentario adicional. Microsoft recomienda que use un PrintDocument y modifique su PrinterSettings en lugar de crear una PrinterSettings directamente.

Tenga en cuenta que el artículo que dowski y Panos se referían 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 otros comienzan con 0. por ejemplo, " ExtendedPrinterStatus " el primer valor 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, " ErrorState " el primer valor 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 " ;.

Solo como referencia, aquí es una lista de todas las propiedades disponibles para un objeto de administración de impresora.

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

Ha pasado mucho tiempo desde que trabajé en un entorno Windows, pero le sugiero que mire utilizando WMI .

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

http://msdn.microsoft .com / es-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 tocando WinSpool.drv (es decir, la API de Windows); puede obtener todos los detalles sobre las interfaces, estructuras y amp; constantes de pinvoke.net, o he reunido el código en http://delradiesdev.blogspot.com/2012/02/accessing-printer-status-using-winspool.html

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top