2011-06-27 58 views
0

我有一個應用程序允許用戶在打印前選擇打印機。我需要能夠使用.Net打印機選擇對話框返回的信息,找到一種通過SNMP直接與打印機進行通信的方式。我的應用程序的一個要求是,在打印機暫停,卡住或脫機或紙張用完等情況下,它不會向打印機發送任何打印作業。我只能通過SNMP獲取此類信息,以瞭解我所使用的打印機類型。尋找到IP打印機的直接通信通道

我一直在使用WMI查詢來獲取打印機信息,然後使用該WMI查詢中的ShareName和ServerName值來派生到該打印機的通信通道。這已經工作了一年多。

最近,網絡團隊將我的應用程序從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,如果打印機不可用。