c# check printer status

前端 未结 4 509
北海茫月
北海茫月 2020-12-25 15:31

in my application (Windows 7, VS2010) i have to decrement a credit counter after successfully printing an image. Anyway, before starting the entire process, i\'d like to kno

相关标签:
4条回答
  • 2020-12-25 15:43

    The PrintQueue class in the System.Printing namespace is what you are after. It has many properties that give useful information about the status of the printer that it represents. Here are some examples;

            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;
    

    This is by no means a comprehensive list and remember that it is possible for the queue to have one or more of these statuses so you'll have to think about the order in which you handle them.

    0 讨论(0)
  • 2020-12-25 15:46

    The only solution that is reliable across all brands of printers is to use SNMP to query the number of pages printed and ensure that it matches the number of pages in the document sent.

    SNMP OID for page count is 1.3.6.1.2.1.43.10.2.1.4

    From my testing, every other strategy has had unreliable behavior (odd null reference exceptions when fetching the print queue repeatedly) or provided inaccurate status codes or page counts.

    0 讨论(0)
  • 2020-12-25 15:58

    You can do this with printer queues as @mark_h pointed out above.

    However, if your printer is not the default printer you need to load that printer's queue instead. What you need to do instead of calling server.DefaultPrintQueue you would need to load the correct queue by calling GetPrintQueue() then pass it the printer name and an empty string array.

    //Get local print server
    var server = new LocalPrintServer();
    
    //Load queue for correct printer
    PrintQueue queue = server.GetPrintQueue(PrinterName, new string[0] { }); 
    
    //Check some properties of printQueue    
    bool isInError = queue.IsInError;
    bool isOutOfPaper = queue.IsOutOfPaper;
    bool isOffline = queue.IsOffline;
    bool isBusy = queue.IsBusy;
    
    0 讨论(0)
  • 2020-12-25 16:00

    You don't say what version of .Net you're using, but since .Net 3.0 there has been some good printing functionality. I've used this and whilst I can't be sure that it reports all kinds of status levels, I've certainly seen messages such as 'Toner Low' for various printers etc.

    PrinterDescription is a custom class, but you can see the properties its using.

    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
                }
            }
    
    0 讨论(0)
提交回复
热议问题