it-swarm.it

Qual è il modo migliore per ottenere la stampante predefinita in .NET

Devo ottenere il nome predefinito della stampante. Userò C # ma sospetto che si tratti più di una domanda quadro che non sia specifica della lingua.

72
Kevin Gale

Il modo più semplice che ho trovato è creare un nuovo oggetto PrinterSettings. Inizia con tutti i valori predefiniti, quindi puoi controllare la sua proprietà Nome per ottenere il nome della stampante predefinita.

PrinterSettings si trova in System.Drawing.dll nello spazio dei nomi System.Drawing.Printing.

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

In alternativa, potresti usare lo statico PrinterSettings.InstalledPrinters per ottenere un elenco di tutti i nomi delle stampanti, quindi impostare la proprietà PrinterName e controllare IsDefaultPrinter. Non l'ho provato, ma la documentazione sembra suggerire che non funzionerà. Apparentemente IsDefaultPrinter è vero solo quando PrinterName non è impostato esplicitamente.

114
OwenP

Un altro approccio è l'utilizzo di WMI (è necessario aggiungere un riferimento a 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 si desidera solo il nome della stampante, nessun vantaggio. Ma WMI è in grado di restituire un sacco di altre proprietà della stampante:

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 non solo stampanti. Se sei interessato a qualsiasi tipo di dati relativi al computer, è probabile che tu possa ottenerli con WMI. WQL (la versione WMI di SQL) è anche uno dei suoi vantaggi.

11
Uros Calakovic

Uso sempre in questo caso System.Printing.LocalPrintServer, che rende anche possibile ottenere se la stampante è locale, di rete o fax.

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

o usando un metodo statico GetDefaultPrintQueue

LocalPrintServer.GetDefaultPrintQueue().FullName
9

Prova anche questo esempio

 PrinterSettings printerName = new PrinterSettings();

 string defaultPrinter;

 defaultPrinter = printerName.PrinterName;
1
Ramgy Borja
  • 1 ° creare un'istanza dell'oggetto PrintDialog.
  • quindi chiama l'oggetto dialog di stampa e lascia vuoto PrinterName. questo farà sì che l'oggetto Windows restituisca il nome della stampante predefinito
  • scrivere questo su una stringa e usarlo come nome della stampante quando si chiama la procedura di stampa

Codice:

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

Questo dovrebbe funzionare:

using System.Drawing.Printing;

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

0
Tahir