5

PrintQueueオブジェクトに含まれている印刷キューのステータス情報を更新する方法はありますか?

PrintQueueオブジェクトでRefreshを呼び出してみましたが、実際には何もしません。たとえば、プリンタの電源をオフにすると、コントロールパネルにプリンタが「オフライン」と正しく表示されますが、 QueueStatusプロパティとIsOfflineプロパティには、両方でRefreshを何度呼び出しても反映されません。問題のPrintServerPrintQueue

WMIクエリを使用してステータス情報を取得する方法の例を見てきましたが、これらのプロパティはPrintQueueオブジェクトで使用できるため、これらを使用する方法があるかどうか疑問に思います。

4

1 に答える 1

0

PrintDocument (System.Drawing.Printing) を印刷しようとした後、印刷ジョブのステータスを確認してください。

最初のステップ: printDocument を初期化します。

2 番目のステップ: プリンター名の取得元 System.Drawing.Printing.PrinterSettings.InstalledPrinters.Cast<string>();

そしてそれをあなたのprinterDocument.PrinterSettings.PrinterName

3 番目のステップ: 印刷して廃棄してみてください。

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

最後のステップ: タスクでチェックを実行します (UI スレッドをブロックしないでください)。

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

幸運を。

于 2016-11-30T21:34:23.370 に答える