Поиск прямого канала связи с IP-принтером - PullRequest
0 голосов
/ 27 июня 2011

У меня есть приложение, которое позволяет пользователю выбрать принтер перед печатью. Мне нужно иметь возможность, используя информацию, возвращаемую из диалогового окна выбора принтера .Net, найти способ связи через SNMP напрямую с принтером. Одним из требований для моего приложения является то, что оно не отправляет никаких заданий на печать на принтер, когда принтер находится в режиме паузы или застрял или находится в автономном режиме или из бумаги и т. Д. Я могу получить эту информацию только через SNMP для типа принтера, который у меня есть.

Я использовал запрос WMI для получения информации о принтере, а затем выводил канал связи с этим принтером, используя значения ShareName и ServerName в этом запросе WMI. Это работало более года.

Недавно сетевая команда переместила мое приложение с сервера Windows 2003 на сервер Windows 2008 R2. С приложением в новом доме 2008 года значения ServerName и ShareName в запросе WMI всегда возвращаются пустыми, что делает невозможным непосредственное взаимодействие с принтером с использованием моего существующего кода.

У кого-нибудь еще есть другой способ связи с принтерами напрямую, только если пользователь выбирает принтер в диалоговом окне выбора принтера .Net? Для целей этого приложения мы можем ожидать, что принтер всегда будет одного типа и всегда будет подключен к сети.

Вот запрос WMI, который я использовал:

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

Ценю это.

1 Ответ

0 голосов
/ 02 июля 2011

Это тот же ответ, который я дал c #: Как контролировать задание печати с помощью 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, если принтер недоступен.

...