Как получить информацию о принтере в .NET?
-
08-07-2019 - |
Вопрос
В стандартном PrintDialog с выбранным принтером связаны четыре значения:Статус, Тип, Где и Комментарий.
Если я знаю имя принтера, как я могу получить эти значения в C# 2.0?
Решение
Как Довски предложил, вы можете использовать WMI для получения свойств принтера.Следующий код отображает все свойства для данного имени принтера.Среди них вы найдете:Состояние принтера, комментарий, местоположение, имя драйвера, имя порта и т. д.
using System.Management;
...
string printerName = "YourPrinterName";
string query = string.Format("SELECT * from Win32_Printer WHERE Name LIKE '%{0}'", printerName);
using (ManagementObjectSearcher searcher = new ManagementObjectSearcher(query))
using (ManagementObjectCollection coll = searcher.Get())
{
try
{
foreach (ManagementObject printer in coll)
{
foreach (PropertyData property in printer.Properties)
{
Console.WriteLine(string.Format("{0}: {1}", property.Name, property.Value));
}
}
}
catch (ManagementException ex)
{
Console.WriteLine(ex.Message);
}
}
Другие советы
Этот должен работа.
using System.Drawing.Printing;
...
PrinterSettings ps = new PrinterSettings();
ps.PrinterName = "The printer name"; // Load the appropriate printer's setting
После этого различные характеристики Настройки принтера можно прочитать.
Обратите внимание, что ps.isValid()
можно увидеть, существует ли принтер на самом деле.
Редактировать:Еще один комментарий.Microsoft рекомендует использовать Распечатать документ и измените его PrinterSettings, а не создайте PrinterSettings напрямую.
Посмотрите на PrinterSettings.InstalledPrinters р>
Обратите внимание, что статья, в которой Довски и Панос имел в виду (MSDN Win32_принтер) может немного ввести в заблуждение.
Я имею в виду первое значение большинства массивов.некоторые начинаются с 1, а некоторые начинаются с 0.например, "Расширенный статус принтера"Первое значение в таблице равно 1, поэтому ваш массив должен быть примерно таким:
string[] arrExtendedPrinterStatus = {
"","Other", "Unknown", "Idle", "Printing", "Warming Up",
"Stopped Printing", "Offline", "Paused", "Error", "Busy",
"Not Available", "Waiting", "Processing", "Initialization",
"Power Save", "Pending Deletion", "I/O Active", "Manual Feed"
};
и, с другой стороны, "Эрростате"Первое значение в таблице равно 0, поэтому ваш массив должен быть примерно таким:
string[] arrErrorState = {
"Unknown", "Other", "No Error", "Low Paper", "No Paper", "Low Toner",
"No Toner", "Door Open", "Jammed", "Offline", "Service Requested",
"Output Bin Full"
};
КСТАТИ, "Состояние принтера" устарело, но вы можете использовать "Статус принтера".
Просто для справки, здесь - список всех доступных свойств для объекта управления принтером.
usage: printer.Properties["PropName"].Value
Прошло много времени с тех пор, как я работал в среде Windows, но я бы посоветовал вам взглянуть на с использованием WMI .
Я знаю, что это старая публикация, но в настоящее время более простой / быстрый вариант заключается в использовании расширенных служб печати, предлагаемых платформой WPF (используемой не-WPF-приложениями).
http://msdn.microsoft .com / EN-US / библиотека / System.Printing (v = vs.110) .aspx
Пример получения состояния очереди принтера и первого задания.
var queue = new LocalPrintServer().GetPrintQueue("Printer Name");
var queueStatus = queue.QueueStatus;
var jobStatus = queue.GetPrintJobInfoCollection().FirstOrDefault().JobStatus
В качестве альтернативы WMI вы можете получить быстрые и точные результаты, подключившись к WinSpool.drv (то есть Windows API) - вы можете получить все подробности об интерфейсах, структурах и & amp; константы из pinvoke.net, или я собрал код на