Как получить информацию о принтере в .NET? - PullRequest
46 голосов
/ 17 ноября 2008

В стандартном PrintDialog есть четыре значения, связанные с выбранным принтером: Состояние, Тип, Где и Комментарий.

Если я знаю имя принтера, как я могу получить эти значения в C # 2.0?

Ответы [ 8 ]

70 голосов
/ 17 ноября 2008

Как и dowski предложил , вы можете использовать WMI для получения свойств принтера. Следующий код отображает все свойства для данного имени принтера. Среди них вы найдете: PrinterStatus, Комментарий, Местоположение, DriverName, PortName и т. Д.

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);
    }
}
23 голосов
/ 17 ноября 2008

Это должно работать.

using System.Drawing.Printing;

...

PrinterSettings ps = new PrinterSettings();
ps.PrinterName = "The printer name"; // Load the appropriate printer's setting

После этого можно прочитать различные свойства объекта PrinterSettings.

Обратите внимание, что ps.isValid() может видеть, существует ли принтер на самом деле.

Редактировать: один дополнительный комментарий. Microsoft рекомендует использовать PrintDocument и изменять его параметры PrinterSettings вместо непосредственного создания PrinterSettings.

6 голосов
/ 17 ноября 2008
3 голосов
/ 14 января 2012

Просто для справки, здесь - это список всех доступных свойств для объекта управления принтера.

usage: printer.Properties["PropName"].Value
3 голосов
/ 14 августа 2011

Обратите внимание, что статья, на которую dowski и Panos ссылалась ( MSDN Win32_Printer ) быть немного вводящим в заблуждение.

Я имею в виду первое значение большинства массивов. некоторые начинаются с 1, а некоторые начинаются с 0. Например, первое значение в таблице « ExtendedPrinterStatus » равно 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"
};

и с другой стороны, первое значение в таблице " ErrorState " равно 0, поэтому ваш массив должен выглядеть примерно так:

string[] arrErrorState = {
    "Unknown", "Other", "No Error", "Low Paper", "No Paper", "Low Toner",
    "No Toner", "Door Open", "Jammed", "Offline", "Service Requested",
    "Output Bin Full"
};

Кстати, « PrinterState » устарел, но вы можете использовать « PrinterStatus ».

2 голосов
/ 04 ноября 2014

Я знаю, что это старая публикация, но в настоящее время более простой / быстрый вариант - использовать расширенные сервисы печати, предлагаемые платформой WPF (используемой не-WPF-приложениями).

http://msdn.microsoft.com/en-us/library/System.Printing(v=vs.110).aspx

Пример получения статуса очереди принтера и первого задания.

var queue = new LocalPrintServer().GetPrintQueue("Printer Name");
var queueStatus = queue.QueueStatus;
var jobStatus = queue.GetPrintJobInfoCollection().FirstOrDefault().JobStatus
2 голосов
/ 17 ноября 2008

Прошло много времени с тех пор, как я работал в среде Windows, но я бы посоветовал вам взглянуть на с помощью WMI .

0 голосов
/ 27 февраля 2012

В качестве альтернативы WMI вы можете получить быстрые и точные результаты, подключившись к WinSpool.drv (то есть Windows API) - вы можете получить все подробности об интерфейсах, структурах и константах из pinvoke.net, или я поставил код вместе в http://delradiesdev.blogspot.com/2012/02/accessing-printer-status-using-winspool.html

...