2008-09-17 39 views

Respuesta

92

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

PrinterSettings se encuentra en System.Drawing.dll en el espacio de nombres System.Drawing.Printing.

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

Como alternativa, podría tal vez utilizar el método estático PrinterSettings.InstalledPrinters para obtener una lista de todos los nombres de las impresoras, a continuación, establezca la propiedad NombreImpresoray comprobar el IsDefaultPrinter. No lo he intentado, pero la documentación parece sugerir que no funcionará. Aparentemente IsDefaultPrinter solo es verdadero cuando PrinterName no está explícitamente establecido.

+6

Tal vez vale la pena mencionar que las cadenas devueltas desde InstalledPrinters pueden tener una carcasa diferente a la NombreImpresora propiedad. Por ejemplo, esta prueba falló en mi sistema: Dim ps Como nueva PrinterSettings Dim foundDefault As Boolean = False Para cada impresora Como String 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) nombre de devolución; } return null; – BrokeMyLegBiking

+0

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

27

Otro enfoque está utilizando WMI (que tendrá que añadir 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; 
} 
+2

Uso de las nuevas 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 de WMI anterior de Nathan Baulch funcionó para mí en una situación como esa. – Peter

10

Si lo que desea es el nombre de la impresora ninguna ventaja en absoluto. 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 las impresoras. Si está interesado en cualquier tipo de datos relacionados con la computadora, es probable que pueda obtenerlo con WMI. WQL (la versión WMI de SQL) es también una de sus ventajas.

1
  • Primero crea una instancia del objeto PrintDialog.
  • luego llame al objeto de diálogo de impresión y deje en blanco PrinterName. esto hará que las ventanas se oponen a devolver el nombre de la impresora defualt
  • escribir esto en una cadena y utilizarlo como el nombre de la impresora cuando se llama 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 
7

utilizo siempre en este caso 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 el uso de un método estático GetDefaultPrintQueue

LocalPrintServer.GetDefaultPrintQueue().FullName 
1

Pruebe también este ejemplo

PrinterSettings printerName = new PrinterSettings(); 

string defaultPrinter; 

defaultPrinter = printerName.PrinterName; 
+1

El código más rápido para mí. Gracias –

Cuestiones relacionadas