2010-11-23 76 views
3

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

PrintQueueオブジェクトでRefreshを呼び出そうとしましたが、実際には何もしません。たとえば、プリンタをオフにして、コントロールパネルにプリンタが「オフライン」と正しく表示されていますが、QueueStatusプロパティとIsOfflineプロパティは反映されません。 PrintServerおよびPrintQueueです。

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

+0

このWPFはどのように関係していますか? – benPearce

+0

こんにちは、あなたはこの問題の解決策を見つけることができましたか?私もそれに直面した。 – rem

+0

@rem - no、残念ながら、これらのプロパティを動作させる方法を見つけることができませんでした。最終的には、私のアプリにプリンタのステータスを表示するだけでは問題にならなかったので、私は全体のアイデアをあきらめました。答えを見つけたら、ここに投稿してください! –

答えて

0

PrintDocument(System.Drawing.Printing)を印刷した後、printjobsのステータスを確認してみます。

最初の手順: printDocumentを初期化します。

第二ステップ: System.Drawing.Printing.PrinterSettings.InstalledPrinters.Cast<string>();

からお使いのプリンタ名を取得し、あなたのprinterDocument.PrinterSettings.PrinterName

第三ステップにそれをコピーします。 印刷して処分してください。

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

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

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

幸運:ここ

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

は実装です。

+0

新しいSystem.Printing.PrintQueueオブジェクトに関する質問がありました。あなたの答えは古いSystem.Drawing.Printing ...オブジェクトです。私はここにそれを追加する時間を取っていただきありがとうございますが、それは質問に答えることはありません。 –

+0

PrintQueueも使用しようとしました。 printQueueインスタンス(印刷しようとした後)と同じ(サイクル )を実行できます。あなたはpq.QueueStatusを取得することができ、失敗した印刷の後にPrintQueueStatus.Error値を返します。私もこの方法を試しました。しかし 私の答えは 'printQueue.QueueStatus'よりも信頼できる解決策であることを経験しました –

+0

印刷キューの状態を得る前に実際に何か印刷しなければなりませんか?それはユーザーにとってはむしろ問題になるだろうと思いませんか?それとも私は誤解しましたか? –

関連する問題