¿Cuál es la mejor manera de obtener la impresora predeterminada en .NET?

81

Necesito obtener el nombre de la impresora predeterminada. Usaré C #, pero sospecho que se trata más de una cuestión de marco y no es un lenguaje específico.

Kevin Gale
fuente

Respuestas:

129

La forma más fácil que encontré es crear un nuevo PrinterSettingsobjeto. Comienza con todos los valores predeterminados, por lo que puede verificar su propiedad Nombre para obtener el nombre de la impresora predeterminada.

PrinterSettingsestá en System.Drawing.dll en el espacio de nombres System.Drawing.Printing.

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

Alternativamente, podría usar el PrinterSettings.InstalledPrintersmétodo estático para obtener una lista de todos los nombres de impresora, luego establecer la propiedad PrinterName y verificar IsDefaultPrinter . No he probado esto, pero la documentación parece sugerir que no funcionará. Aparentemente, IsDefaultPrinter solo es verdadero cuando PrinterName no se establece explícitamente.

OwenP
fuente
6
Tal vez valga la pena mencionar que las cadenas devueltas por InstalledPrinters pueden tener una carcasa diferente a la de la propiedad PrinterName. Por ejemplo, esta prueba falló en mi sistema: Dim ps As New PrinterSettings Dim foundDefault As Boolean = False Para cada impresora Como cadena en PrinterSettings.InstalledPrinters If printer = ps.PrinterName Then foundDefault = True End If Next Assert.IsTrue (foundDefault)
miasbeck
1
Aquí está la técnica de bucle, que funciona para mí. : foreach (nombre de cadena en PrinterSettings.InstalledPrinters) {PrinterSettings ps = new PrinterSettings (); ps.PrinterName = nombre; if (ps.IsDefaultPrinter) return nombre; } return null;
BrokeMyLegBiking
Tenga en cuenta que este método no funciona si ejecuta su aplicación como un servicio de Windows. No he descubierto por qué. Me estoy ejecutando como un servicio local.
Rudy Hinojosa
@BrokeMyLegBiking Eso no debería funcionar según MSDN : "IsDefaultPrinter siempre devuelve falso cuando estableces explícitamente la propiedad PrinterName en un valor de cadena que no sea nulo".
jnm2
Puede condensar esto en 'string pName = new PrinterSettings (). PrinterName;'
PKanold
31

Otro enfoque es usar WMI (deberá agregar una referencia al ensamblado System.Management):

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;
}
Nathan Baulch
fuente
2
Usando el nuevo PrinterSettings (). PrinterName a veces devuelve "La impresora predeterminada no está configurada" como el nombre de la impresora, incluso cuando se ha configurado la impresora predeterminada. La solución WMI anterior de Nathan Baulch funcionó para mí en una situación como esa.
Peter
13

Si solo quiere el nombre de la impresora, no hay ninguna ventaja. Pero WMI es capaz de devolver un montón de otras propiedades de la impresora:

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

y no solo impresoras. Si está interesado en cualquier tipo de información relacionada con la computadora, es probable que pueda obtenerla con WMI. WQL (la versión WMI de SQL) también es una de sus ventajas.


fuente
10

Siempre utilizo en este caso el System.Printing.LocalPrintServer, que también permite obtener si la impresora es local, de red o de fax.

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

o usando un método estático GetDefaultPrintQueue

LocalPrintServer.GetDefaultPrintQueue().FullName
Alexander Zwitbaum
fuente
2

Prueba también este ejemplo

 PrinterSettings printerName = new PrinterSettings();

 string defaultPrinter;

 defaultPrinter = printerName.PrinterName;
Ramgy Borja
fuente
1

Esto debería funcionar:

using System.Drawing.Printing;

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

Tahir
fuente
0
  • Primero crea una instancia del PrintDialog objeto.
  • luego llame al objeto de diálogo de impresión y deje el PrinterName espacio en blanco. esto hará que el objeto de Windows devuelva el nombre predeterminado de la impresora
  • escriba esto en una cadena y utilícelo como el nombre de la impresora cuando llame al procedimiento de impresión

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
Joe McBride
fuente