System.Printing.PrintQueue QueueStatus не обновляется

Есть ли способ обновить информацию о состоянии очереди печати, содержащуюся в объекте PrintQueue?

Я пытался вызвать Refresh для объекта PrintQueue, но на самом деле ничего не происходит. Например, я выключил принтер, и панель управления правильно отображает принтер как "автономный", однако свойство QueueStatus, а также свойство IsOffline не отражают этого - независимо от того, сколько раз я вызываю команду "Обновить" для обоих PrintServer и PrintQueue в вопросе.

Я видел примеры того, как получить информацию о состоянии с помощью запросов WMI, но мне интересно - поскольку эти свойства доступны в объекте PrintQueue - есть ли способ их использовать.

2 ответа

После того, как вы попытаетесь распечатать документ PrintDocument (System.Drawing.Printing), попробуйте проверить состояние заданий на печать.

Первый шаг: инициализируйте ваш printDocument.

Второй шаг: получите имя вашего принтера от System.Drawing.Printing.PrinterSettings.InstalledPrinters.Cast<string>();

И скопируйте его в свой printerDocument.PrinterSettings.PrinterName

Третий шаг: попробуйте распечатать и утилизировать.

printerDocument.Print();
printerDocument.Dispose();

Последний шаг: Запустите проверку в Задаче (НЕ блокируйте поток пользовательского интерфейса).

   Task.Run(()=>{
     if (!IsPrinterOk(printerDocument.PrinterSettings.PrinterName,checkTimeInMillisec))
     {
        // failed printing, do something...
     }
    });

Вот реализация:

        private bool IsPrinterOk(string name,int checkTimeInMillisec)
        {
            System.Collections.IList value = null;
            do
            {
                //checkTimeInMillisec should be between 2000 and 5000
                System.Threading.Thread.Sleep(checkTimeInMillisec);

                using (System.Management.ManagementObjectSearcher searcher = new System.Management.ManagementObjectSearcher("SELECT * FROM Win32_PrintJob WHERE Name like '%" + name + "%'"))
                {
                    value = null;

                    if (searcher.Get().Count == 0) // Number of pending document.
                        return true; // return because we haven't got any pending document.
                    else
                    {
                        foreach (System.Management.ManagementObject printer in searcher.Get())
                        {
                            value = printer.Properties.Cast<System.Management.PropertyData>().Where(p => p.Name.Equals("Status")).Select(p => p.Value).ToList();
                            break; 
                        }
                    }
                }
           }
           while (value.Contains("Printing") || value.Contains("UNKNOWN") || value.Contains("OK"));

           return value.Contains("Error") ? false : true;    
        }

Удачи.

Очень поздний ответ,

Единственный способ, который я нашел до сих пор, — это перезапустить службу диспетчера очереди печати, но это вызывает множество других проблем с WMI, и это не чистое решение.

Другие вопросы по тегам