2008-11-17 5 views

ответ

62

Как dowski suggested, вы можете использовать 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); 
    } 
} 
2

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

22

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

using System.Drawing.Printing; 

...

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

После этого, различные properties из PrinterSettings может быть прочитан.

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

Редактировать: Еще один комментарий. Корпорация Майкрософт рекомендует использовать PrintDocument и изменять свои настройки PrinterSettings, а не напрямую создавать настройки PrinterSettings.

+0

ур сообщение действительно помогли. но мне нужен адрес ipa и имя порта. как получить IP-адрес и имя порта для выбранного/загруженного принтера ...? – Ashutosh 2012-10-26 08:47:10

+0

есть один плохой способ сделать это, используя выбранный метод ответа, он дает имя сервера для принтера, и если мы пингом это имя, он разрешает ip-адрес и там результат ping может быть проанализирован. Скажите, пожалуйста, если у вас есть лучший способ сделать это – Ashutosh 2012-10-26 11:42:12

+0

Я использую .Net 4.5, недоступно в .Net 4.5 – AmirhosseinYari 2017-07-10 11:55:05

3

Пожалуйста, обратите внимание, что в статье, что dowski и Панос было заявлено (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" 
}; 

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

2

Только для справки, here - это список всех доступных свойств для принтера ManagementObject.

usage: printer.Properties["PropName"].Value 
2

Я знаю, что это старая публикация, но в настоящее время проще или быстрее заключается в использовании расширенных услуг печати, предлагаемых инфраструктурой 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