it-swarm-pt.tech

Qual é a melhor maneira de obter a impressora padrão no .NET

Preciso obter o nome da impressora padrão. Eu vou usar o C #, mas suspeito que isso seja mais uma questão de estrutura e não seja específica do idioma.

72
Kevin Gale

A maneira mais fácil que encontrei é criar um novo objeto PrinterSettings. Ele começa com todos os valores padrão, para que você possa verificar sua propriedade Nome para obter o nome da impressora padrão.

PrinterSettings está no System.Drawing.dll no espaço para nome System.Drawing.Printing.

PrinterSettings settings = new PrinterSettings();
Console.WriteLine(settings.PrinterName);

Como alternativa, você pode usar o método estático PrinterSettings.InstalledPrinters Para obter uma lista de todos os nomes de impressoras, definir a propriedade PrinterName e verificar a IsDefaultPrinter. Eu não tentei isso, mas a documentação parece sugerir que não funcionará. Aparentemente, IsDefaultPrinter só é verdadeiro quando PrinterName não está definido explicitamente.

114
OwenP

Outra abordagem é usar o WMI (você precisará adicionar uma referência ao System.Management Assembly):

public static string GetDefaultPrinterName()
{
    var query = new ObjectQuery("SELECT * FROM Win32_Printer");
    var searcher = new ManagementObjectSearcher(query);

    foreach (ManagementObject mo in searcher.Get())
    {
        if (((bool?) mo["Default"]) ?? false)
        {
            return mo["Name"] as string;
        }
    }

    return null;
}
28
Nathan Baulch

Se você deseja apenas o nome da impressora, não há vantagem alguma. Mas o WMI é capaz de retornar várias outras propriedades da impressora:

using System;
using System.Management;
namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
            ObjectQuery query = new ObjectQuery(
                "Select * From Win32_Printer " +
                "Where Default = True");

            ManagementObjectSearcher searcher =
                new ManagementObjectSearcher(query);

            foreach (ManagementObject mo in searcher.Get())
            {
                Console.WriteLine(mo["Name"] + "\n");

                foreach (PropertyData p in mo.Properties)
                {
                    Console.WriteLine(p.Name );
                }
            }
        }
    }
}

e não apenas impressoras. Se você estiver interessado em qualquer tipo de dados relacionados ao computador, é provável que possa obtê-lo com o WMI. O WQL (a versão WMI do SQL) também é uma das suas vantagens.

11
Uros Calakovic

Eu sempre uso neste caso o System.Printing.LocalPrintServer, que também permite obter se a impressora é local, de rede ou de fax.

string defaultPrinter;
using(var printServer = new LocalPrintServer()) {
  defaultPrinter = printServer.DefaultPrintQueue.FullName);
}

ou usando um método estático GetDefaultPrintQueue

LocalPrintServer.GetDefaultPrintQueue().FullName
9
Alexander Zwitbaum

Tente também este exemplo

 PrinterSettings printerName = new PrinterSettings();

 string defaultPrinter;

 defaultPrinter = printerName.PrinterName;
1
Ramgy Borja
  • Primeiro crie uma instância do objeto PrintDialog.
  • depois chame o objeto de diálogo de impressão e deixe PrinterName em branco. isso fará com que o objeto windows retorne o nome da impressora com defeito
  • escreva isso em uma string e use-o como o nome da impressora quando você chamar o procedimento de impressão

Código:

Try

    Dim _printDialog As New System.Windows.Forms.PrintDialog

    xPrinterName = _printDialog.PrinterSettings.PrinterName '= "set as Default printer"

Catch ex As Exception
    System.Windows.Forms.MessageBox.Show("could not printed Label.", "Print Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
0
DieselDog

Isso deve funcionar:

using System.Drawing.Printing;

PrinterSettings settings = new PrinterSettings(); string defaultPrinterName = settings.PrinterName;

0
Tahir