c # проверить состояние принтера - PullRequest
12 голосов
/ 15 февраля 2011

в моем приложении (Windows 7, VS2010) я должен уменьшить счетчик кредитов после успешной печати изображения. В любом случае, прежде чем начать весь процесс, я хотел бы узнать о состоянии принтера, чтобы предупредить пользователя об отсутствии бумаги, замятии бумаги и так далее. Теперь, оглядываясь вокруг, я нашел несколько примеров, которые используют Windows WMI, но ... никогда не работают. Например, при использовании фрагмента ЭТОГО состояние принтера всегда готово, даже если я вытащу бумагу, открою крышку ... выключите принтер.

Состояние принтера также всегда хорошее, так как я проверяю из офиса принтер, который удобно выключен дома. я должен взорвать устройство динамитом, чтобы иметь состояние ошибки принтера?

Это код, который я использовал

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

    }

}

Где в качестве параметра принимается «имя_принтера».

Спасибо за совет.

Ответы [ 4 ]

9 голосов
/ 03 февраля 2012

Вы не говорите, какую версию .Net вы используете, но начиная с .Net 3.0 появилось несколько хороших функций печати. Я использовал это, и хотя я не могу быть уверен, что он сообщает обо всех уровнях состояния, я, конечно, видел сообщения, такие как «Тонер низкий» для различных принтеров и т. Д.

PrinterDescription - это пользовательский класс, но вы можете видеть свойства его использования.

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
            }
        }
7 голосов
/ 30 апреля 2016

Класс PrintQueue в пространстве имен System.Printing - это то, что вам нужно. У него много свойств, которые дают полезную информацию о состоянии принтера, который он представляет. Вот несколько примеров;

        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;

Это ни в коем случае не исчерпывающий список, и помните, что очередь может иметь один или несколько из этих статусов, поэтому вам придется подумать о порядке их обработки.

0 голосов
/ 12 января 2019

Вы можете сделать это с очередями принтера, как указано выше @ mark_h .

Однако, если ваш принтер не является принтером по умолчанию, вам нужно загрузить очередь этого принтера. Что нужно сделать вместо вызова server.DefaultPrintQueue, вам нужно загрузить правильную очередь, вызвав GetPrintQueue(), а затем передать ему имя принтера и пустой массив строк.

//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 голосов
/ 21 января 2016

Единственное надежное решение для принтеров всех марок - это использование SNMP для запроса количества напечатанных страниц и его соответствия количеству страниц в отправляемом документе.

OID SNMP для подсчета страниц1.3.6.1.2.1.43.10.2.1.4

Согласно моему тестированию, любая другая стратегия имела ненадежное поведение (нечетные исключения нулевых ссылок при повторном получении очереди печати) или предоставила неточные коды состояния или количество страниц.

...