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

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

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

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


person Mike Dinescu    schedule 23.11.2010    source источник
comment
Как это связано с WPF?   -  person benPearce    schedule 24.11.2010
comment
Привет, тебе удалось найти решение этой проблемы? Я тоже столкнулся с этим.   -  person rem    schedule 16.06.2011
comment
@rem - нет, к сожалению, я не смог найти способ заставить эти свойства работать. В конце концов я отказался от всей этой идеи, так как не стоило заморачиваться просто отображать состояние принтеров в моем приложении. Если вы найдете ответ, пожалуйста, напишите его здесь!   -  person Mike Dinescu    schedule 16.06.2011
comment
Хорошо, Мики, спасибо, что сообщили!   -  person rem    schedule 16.06.2011


Ответы (1)


После попытки распечатать 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;    
        }

Удачи.

person Péter Hidvégi    schedule 30.11.2016
comment
Вопрос касался новых объектов System.Printing.PrintQueue. Ваш ответ касается более старых объектов System.Drawing.Printing.... Я ценю, что вы нашли время, чтобы добавить его сюда, но это не отвечает на вопрос. - person Mike Dinescu; 01.12.2016
comment
Я тоже пытался использовать PrintQueue. Вы можете сделать то же самое (в цикле) с вашим экземпляром printQueue (после попытки печати). Вы можете получить свой pq.QueueStatus, и он вернется со значением PrintQueueStatus.Error после неудачной печати. я тоже пробовал этот метод. Но я убедился, что мой ответ является более надежным решением, чем printQueue.QueueStatus - person Péter Hidvégi; 01.12.2016
comment
Таким образом, вам действительно нужно попытаться что-то напечатать, прежде чем вы сможете получить статус очереди печати? Это было бы довольно проблематично для пользователя, не так ли? Или я неправильно прочитал? - person Mike Dinescu; 01.12.2016
comment
Да, вам придется попробовать что-то напечатать, прежде чем вы сможете получить QueueStatus для printerQueue, и да, это не лучшее решение, которое я могу себе представить, но оно работает, и, по крайней мере, оно вернет значение ошибки после неудачной печати, и это можно сделать вывод из ответа, что принтер недоступен. - person Péter Hidvégi; 01.12.2016
comment
Я согласен, что в случае с автономными принтерами это сработает, но в случае, когда принтер находится в сети, постоянно что-то печатает, это просто нехороший UX - на самом деле я бы предпочел не отображать статус, чем ложно отправлять задания на печать на все принтеры. определить их статус. Вы не согласны? - person Mike Dinescu; 01.12.2016
comment
Хорошо, но на практике пользователь выбирает принтер (из InstalledPrinters), и пользователь собирается отправить документ на выбранный принтер. Наша задача подтвердить, что печать прошла успешно или неудачно. Доступен ли принтер, я не уверен, что принтер не выдаст никакой ошибки. (Например, закончилась бумага или закончились чернила или другие проблемы.) После неудачной печати пользователь может выбрать другой принтер. - person Péter Hidvégi; 01.12.2016
comment
Да, но вопрос был о предоставлении пользователям возможности видеть, какие принтеры находятся в сети из принтеров, доступных на компьютере. Во многом так же, как вы можете сказать в Панели управления: те, которые находятся в сети, являются сплошными, а принтеры, которые находятся в автономном режиме или не подключены, полупрозрачны. Это то, что я искал - person Mike Dinescu; 01.12.2016