Pergunta

No PrintDialog padrão existem quatro valores associados a uma impressora selecionada: Status, Tipo, onde e Comment

.

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

Foi útil?

Solução

Como dowski sugeriu , você poderia usar o WMI para obter propriedades da impressora. O código a seguir exibe todas as propriedades de um determinado nome de impressora. Entre eles você vai encontrar:. PrinterStatus, Comentário, Localização, 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);
    }
}

Outras dicas

Este deve trabalho.

using System.Drawing.Printing;

...

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

Depois disso, os vários Propriedades de PrinterSettings pode ser lido.

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

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

Por favor note que o artigo que dowski e Panos foi reffering a ( MSDN Win32_Printer ) pode ser um pouco enganador

Estou me referindo ao primeiro valor da maioria das matrizes. alguns começa com 1 e alguns começa com 0. por exemplo, " ExtendedPrinterStatus " primeiro valor na tabela é 1, portanto, a matriz deve ser algo como isto:

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, " ErrorState " primeiro valor na tabela é 0, portanto, a matriz deve ser algo como isto:

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 ".

Apenas para referência, aqui é uma lista de todas as propriedades disponíveis para um ManagementObject impressora.

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

Tem sido um longo tempo desde que eu trabalhei em um ambiente Windows, mas gostaria de sugerir que você olha para usando WMI .

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

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

Um exemplo para recuperar o status da fila de impressão e primeiro emprego ..

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

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top