c # controlla lo stato della stampante

nella mia applicazione (Windows 7, VS2010) devo decrementare un contatore di crediti dopo aver stampato con successo un’immagine. Ad ogni modo, prima di iniziare l’intero processo, vorrei conoscere lo stato della stampante per avvisare l’utente su carta esaurita, inceppamento della carta e così via. Ora, guardando intorno ho trovato diversi esempi che usano Windows WMI ma … non funziona mai. Usando QUESTO frammento, ad esempio, lo stato della stampante è sempre pronto anche se rimuovo la carta, apro il coperchio … spegni la stampante.

Lo stato della stampante è sempre buono anche adesso, che sto testando dall’ufficio la stampante che è comodamente spenta a casa. devo fare detonare il dispositivo con la dinamite per avere uno stato di errore della stampante?

Questo è il codice che ho usato

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

Dove ‘printerName’ è ricevuto come parametro.

Grazie in consiglio.

    Non si dice quale versione di .Net si sta usando, ma da. 3.0 3.0 ci sono state alcune buone funzionalità di stampa. Ho usato questo e anche se non posso essere sicuro che riporta tutti i tipi di livelli di stato, ho sicuramente visto messaggi come “Toner Low” per varie stampanti ecc.

    PrinterDescription è una class personalizzata, ma è ansible vederne l’utilizzo.

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

      PrintQueueCollection printQueues = null; List printerDescriptions = null; // Get a list of available printers. this.printServer = new PrintServer(); printQueues = this.printServer.GetPrintQueues(new[] { EnumeratedPrintQueueTypes.Local, EnumeratedPrintQueueTypes.Connections }); printerDescriptions = new List(); 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 } } 

    La class PrintQueue nello spazio dei nomi System.Printing è ciò che stai cercando . Ha molte proprietà che forniscono utili informazioni sullo stato della stampante che rappresenta. Ecco alcuni esempi;

      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; 

    Questo non è affatto un elenco completo e ricorda che è ansible che la coda abbia uno o più di questi stati, quindi dovrai pensare all’ordine in cui li gestisci.

    L’unica soluzione affidabile per tutte le marche di stampanti è l’utilizzo di SNMP per interrogare il numero di pagine stampate e assicurarsi che corrisponda al numero di pagine nel documento inviato.

    L’OID SNMP per il conteggio delle pagine è 1.3.6.1.2.1.43.10.2.1.4

    Dai miei test, ogni altra strategia ha avuto un comportamento inaffidabile (eccezioni di riferimento null dispari durante il recupero della coda di stampa ripetutamente) o ha fornito codici di stato o conteggi di pagina imprecisi.