我有一个应用程序,允许用户在打印前选择打印机。我需要能够使用从.Net打印机选择对话框返回的信息,找到通过SNMP直接与打印机进行通信的方法。我的应用程序的一个要求是,当打印机暂停或卡住或脱机或缺纸等时,它不会向打印机发送任何打印作业。我只能通过SNMP获取此信息,以获得我所拥有的打印机类型。
我一直在使用WMI查询获取打印机信息,然后使用该WMI查询中的ShareName和ServerName值派生到该打印机的通信通道。这已经工作了一年多。
最近,网络团队将我的应用程序从Windows 2003服务器移动到Windows 2008 R2服务器。随着应用程序在其新的2008主页中,WMI查询中的ServerName和ShareName的值始终为空,因此无法使用现有代码直接与打印机通信。
是否有其他人只能根据用户从.Net打印机选择对话框中选择打印机而直接与打印机通信?出于本申请的目的,我们可以安全地期望打印机始终属于同一类型并始终连接到网络。
以下是我一直使用的WMI查询:
"SELECT * from Win32_Printer WHERE Name LIKE '%MyPrinter'"
欣赏它。
答案 0 :(得分: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 为您提供所有状态正在找。
话虽这么说, PrinterState 和 PrinterStatus 应该返回>如果打印机不可用,则为0。