2011-02-15 147 views
11

en mi aplicación (Windows Seven, VS2010) tengo que disminuir un contador de crédito después de imprimir correctamente una imagen. De todos modos, antes de comenzar todo el proceso, me gustaría saber sobre el estado de la impresora para alertar al usuario sobre la salida del papel, el atasco de papel, etc. Ahora, mirando a mi alrededor encontré varios ejemplos que usan Windows WMI pero ... nunca funciona. Utilizando el fragmento THIS, por ejemplo, el estado de la impresora siempre está listo, también si retiro el papel, abra la tapa ... apague la impresora.C# compruebe el estado de la impresora

El estado de la impresora siempre es bueno también ahora, que estoy probando desde la oficina la impresora que está cómodamente apagada en casa. ¿Debo detonar el dispositivo con dinamita para tener un estado de error de la impresora?

Este es el código que he usado

ManagementObjectCollection MgmtCollection; 
ManagementObjectSearcher MgmtSearcher; 

//Perform the search for printers and return the listing as a collection 
MgmtSearcher = new ManagementObjectSearcher("Select * from Win32_Printer"); 
MgmtCollection = MgmtSearcher.Get(); 

foreach (ManagementObject objWMI in MgmtCollection) 
{ 

    string name = objWMI["Name"].ToString().ToLower(); 

    if (name.Equals(printerName.ToLower())) 
    { 

     int state = Int32.Parse(objWMI["ExtendedPrinterStatus"].ToString()); 
     if ((state == 1) || //Other 
     (state == 2) || //Unknown 
     (state == 7) || //Offline 
     (state == 9) || //error 
     (state == 11) //Not Available 
     ) 
     { 
     throw new ApplicationException("hope you are finally offline"); 
     } 

     state = Int32.Parse(objWMI["DetectedErrorState"].ToString()); 
     if (state != 2) //No error 
     { 
     throw new ApplicationException("hope you are finally offline"); 
     } 

    } 

} 

Dónde nomImpr 'se recibe como parámetro.

Gracias en consejo.

+2

Cuando encuentre algo que funcione, recuerde que tiene que hacer frente a todas o algunas de estas situaciones que surjan * como * también imprima: la dinamita puede sonar entre verificar el estado y realmente comenzar el trabajo de impresión. –

+2

puede culpar a WMI. la mayoría de los controladores de impresora no actualizan correctamente el estado de la impresora para que WMI la seleccione. lo hemos enfrentado varias veces –

+0

¿a qué impresora (s) estás mirando? –

Respuesta

9

No dice qué versión de .Net está usando, pero desde .Net 3.0 ha habido algunas buenas funciones de impresión. Lo he usado y aunque no puedo estar seguro de que reporte todo tipo de niveles de estado, ciertamente he visto mensajes como "Tóner bajo" para varias impresoras, etc.

PrinterDescription es una clase personalizada, pero puedes ver las propiedades que está usando.

http://msdn.microsoft.com/en-us/library/system.printing.aspx

 PrintQueueCollection printQueues = null; 
     List<PrinterDescription> printerDescriptions = null; 

     // Get a list of available printers. 
     this.printServer = new PrintServer(); 
     printQueues = this.printServer.GetPrintQueues(new[] { EnumeratedPrintQueueTypes.Local, EnumeratedPrintQueueTypes.Connections }); 
     printerDescriptions = new List<PrinterDescription>(); 

     foreach (PrintQueue printQueue in printQueues) 
     { 
      // The OneNote printer driver causes crashes in 64bit OSes so for now just don't include it. 
      // Also redirected printer drivers cause crashes for some printers. Another WPF issue that cannot be worked around. 
      if (printQueue.Name.ToUpperInvariant().Contains("ONENOTE") || printQueue.Name.ToUpperInvariant().Contains("REDIRECTED")) 
      { 
       continue; 
      } 

      string status = printQueue.QueueStatus.ToString(); 

      try 
      { 
       PrinterDescription printerDescription = new PrinterDescription() 
       { 
        Name = printQueue.Name, 
        FullName = printQueue.FullName, 
        Status = status == Strings.Printing_PrinterStatus_NoneTxt ? Strings.Printing_PrinterStatus_ReadyTxt : status, 
        ClientPrintSchemaVersion = printQueue.ClientPrintSchemaVersion, 
        DefaultPrintTicket = printQueue.DefaultPrintTicket, 
        PrintCapabilities = printQueue.GetPrintCapabilities(), 
        PrintQueue = printQueue 
       }; 

       printerDescriptions.Add(printerDescription); 
      } 
      catch (PrintQueueException ex) 
      { 
       // ... Logging removed 
      } 
     } 
+1

Si imprimo una página desde una aplicación de consola directamente a la impresora (usando el proceso con verbo = "imprimir" y alimentarlo con .pdf); ¿Es posible rastrear la cola de impresión como si el documento se imprimió correctamente? (¿Para el documento específico?) – flute

+1

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

0

La única solución que sea fiable en todas las marcas de impresoras es el uso de SNMP para consultar el número de páginas impresas y asegurarse de que coincide con el número de páginas del documento enviado.

SNMP OID para el recuento de páginas es 1.3.6.1.2.1.43.10.2.1.4

De mis pruebas, cada otra estrategia ha tenido un comportamiento poco fiable (impares excepciones referencia nula cuando ir a buscar la cola de impresión en varias ocasiones) o proporcionado códigos de estado inexactos o recuentos de páginas.

7

La clase PrintQueue en el espacio de nombres System.Printing es lo que buscas. Tiene muchas propiedades que brindan información útil sobre el estado de la impresora que representa. Aquí hay unos ejemplos;

 var server = new LocalPrintServer(); 

     PrintQueue queue = server.DefaultPrintQueue; 

     //various properties of printQueue 
     var isOffLine = queue.IsOffline; 
     var isPaperJam = queue.IsPaperJammed; 
     var requiresUser = queue.NeedUserIntervention; 
     var hasPaperProblem = queue.HasPaperProblem; 
     var isBusy = queue.IsBusy; 

Esto es de ninguna manera una lista completa y recordar que es posible que la cola para tener uno o más de estos estados por lo que tendrá que pensar en el orden en que las manejan.

+0

En realidad, me retracto de mi comentario, esto no funciona. – Yusha

+0

Usted solo está leyendo una impresora predeterminada. un sistema puede tener múltiples impresoras instaladas y cada uno tiene una cola de sí mismo y el estado de sí mismo – AaA

Cuestiones relacionadas