2011-06-27 17 views
0

私は、ユーザーが印刷する前にプリンタを選ぶことができるアプリケーションを持っています。 .Netプリンタ選択ダイアログから返された情報を使用して、プリンタと直接SNMPを介して通信する方法を見つけることができる必要があります。私のアプリケーションの要件の1つは、プリンタが一時停止中または紙詰まり中やオフライン中や紙切れ中など、プリンタに印刷ジョブを送信しないということです。この情報は、プリンタの種類によってSNMP経由でのみ取得できます。IPプリンタとの直接通信チャネルを見つける

WMIクエリを使用してプリンタ情報を取得し、そのWMIクエリのShareNameとServerNameの値を使用して、そのプリンタへの通信チャネルを導出しています。これは1年以上も働いています。

最近、ここのネットワークチームは、アプリケーションをWindows 2003サーバーからWindows 2008 R2サーバーに移動しました。新しい2008ホームのアプリケーションでは、WMIクエリのServerNameとShareNameの値が常に空に戻り、既存のコードを使用してプリンタと直接通信できなくなります。

他の誰かが、.Netプリンタ選択ダイアログからプリンタを選択したユーザに基づいて、プリンタと直接通信する別の方法がありますか?このアプリケーションでは、プリンターが常に同じタイプで、常にネットワークに接続されていることを期待しています。ここで

は、私が使用しているWMIクエリです:

"SELECT * from Win32_Printer WHERE Name LIKE '%MyPrinter'" 

はそれを感謝しています。

+0

WMIを使用して直接PrinterStateまたはPrinterStatusのいずれかを取得できませんか。 –

+0

プリンタが利用可能である場合、Windows自身が確実に私に告げるわけではありませんが、それを行うWMIクエリを見つけましたが、プリンタがオンになって準備ができているときにプリンタが利用できないことがよくあります。 – omatase

答えて

0

これは、私がここでc# : How to Monitor Print job Using winspool_drv

に与えた同じ答えが使用Win32_Printerの例です。

PrintDialog pd = new PrintDialog(); 
pd.ShowDialog(); 
PrintDoc.PrinterSettings = pd.PrinterSettings; 
PrintDoc.PrintPage += new PrintPageEventHandler(PrintDoc_PrintPage); 
PrintDoc.Print(); 

object status = Convert.ToUInt32(9999); 
while ((uint)status != 0) // 0 being idle 
{ 
    ManagementObjectSearcher mos = new ManagementObjectSearcher("select * from Win32_Printer where Name='" + pd.PrinterSettings.PrinterName + "'"); 
    foreach (ManagementObject service in mos.Get()) 
    { 
    status = service.Properties["PrinterState"].Value; 
    Thread.Sleep(50); 
    } 
} 

ドキュメントはPrinterStateが廃止され、そしてあなたが不幸であるPrinterStatusを、使用すべきであると述べている、PrinterStateを考慮すると、あなたが探しているすべてのステータスを提供します。プリンタが使用できない場合は言って、PrinterStatePrinterStatus両方が> 0を返す必要があることを

関連する問題