Como obter informações sobre impressoras no .NET?

No PrintDialog padrão, há quatro valores associados a uma impressora selecionada: Status, Type, Where e Comment.

Se eu souber o nome de uma impressora, como posso obter esses valores em C # 2.0?

Como a dowski sugeriu , você pode usar o WMI para obter as propriedades da impressora. O código a seguir exibe todas as propriedades para um determinado nome de impressora. Entre eles você encontrará: PrinterStatus, Comment, Location, DriverName, PortName, etc.

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); } } 

Isso deve funcionar.

 using System.Drawing.Printing; 

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

Depois disso, as várias propriedades do PrinterSettings podem ser lidas.

Observe que ps.isValid() pode ver se a impressora realmente existe.

Edit: Um comentário adicional. A Microsoft recomenda que você use um PrintDocument e modifique suas PrinterSettings em vez de criar um PrinterSettings diretamente.

Olhe para PrinterSettings.InstalledPrinters

Observe que o artigo ao qual a dowski e a Panos estavam se referindo ( MSDN Win32_Printer ) pode ser um pouco enganador.

Estou me referindo ao primeiro valor da maioria dos arrays. alguns começam com 1 e alguns começam com 0. por exemplo, o primeiro valor ” ExtendedPrinterStatus ” na tabela é 1, portanto, sua matriz deve ser algo assim:

 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" }; 

e, por outro lado, o primeiro valor ” ErrorState ” na tabela é 0, portanto, sua matriz deve ser algo assim:

 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 ” é obsoleto, mas você pode usar ” PrinterStatus “.

Faz muito tempo desde que eu trabalhei em um ambiente Windows, mas eu sugiro que você olhe para usar o WMI .

Apenas para referência, aqui está uma lista de todas as propriedades disponíveis para uma ManagementObject da impressora.

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

Eu sei que é uma postagem antiga, mas hoje em dia a opção mais fácil / rápida é usar os serviços de impressão avançados oferecidos pela estrutura do WPF (utilizável por aplicativos não-WPF).

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

Um exemplo para recuperar o status da fila da impressora e o primeiro trabalho.

 var queue = new LocalPrintServer().GetPrintQueue("Printer Name"); var queueStatus = queue.QueueStatus; var jobStatus = queue.GetPrintJobInfoCollection().FirstOrDefault().JobStatus 

Como uma alternativa ao WMI, você pode obter resultados rápidos e precisos tocando em WinSpool.drv (ou seja, API do Windows) – você pode obter todos os detalhes sobre as interfaces, estruturas e constantes do pinvoke.net, ou eu juntei o código em http://delradiesdev.blogspot.com/2012/02/accessing-printer-status-using-winspool.html