Was ist der beste Weg, um den Standarddrucker in .NET zu erhalten?

81

Ich muss den Standarddruckernamen erhalten. Ich werde C # verwenden, aber ich vermute, dass dies eher eine Rahmenfrage ist und nicht sprachspezifisch.

Kevin Gale
quelle

Antworten:

128

Der einfachste Weg, den ich gefunden habe, ist das Erstellen eines neuen PrinterSettingsObjekts. Es beginnt mit allen Standardwerten, sodass Sie die Eigenschaft Name überprüfen können , um den Namen des Standarddruckers abzurufen.

PrinterSettingsbefindet sich in System.Drawing.dll im Namespace System.Drawing.Printing.

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

Alternativ können Sie möglicherweise die statische PrinterSettings.InstalledPrintersMethode verwenden, um eine Liste aller Druckernamen abzurufen , dann die PrinterName- Eigenschaft festlegen und den IsDefaultPrinter überprüfen . Ich habe es nicht versucht, aber die Dokumentation scheint darauf hinzudeuten, dass es nicht funktioniert. Anscheinend ist IsDefaultPrinter nur wahr, wenn PrinterName nicht explizit festgelegt ist.

OwenP
quelle
6
Vielleicht ist es erwähnenswert, dass die von InstalledPrinters zurückgegebenen Zeichenfolgen möglicherweise ein anderes Gehäuse als die PrinterName-Eigenschaft haben. Beispiel: Dieser Test ist auf meinem System fehlgeschlagen: Dim ps As New PrinterSettings Dim foundDefault As Boolean = False Für jeden Drucker As String In PrinterSettings.InstalledPrinters If Drucker = ps.PrinterName Then foundDefault = True End If Next Assert.IsTrue (foundDefault)
miasbeck
1
Hier ist die Schleifentechnik, die für mich funktioniert. : foreach (Zeichenfolgenname in PrinterSettings.InstalledPrinters) {PrinterSettings ps = new PrinterSettings (); ps.PrinterName = name; if (ps.IsDefaultPrinter) gibt den Namen zurück; } return null;
BrokeMyLegBiking
Beachten Sie, dass diese Methode nicht funktioniert, wenn Sie Ihre App als Windows-Dienst ausführen. Ich habe nicht herausgefunden warum. Ich arbeite als lokaler Dienst.
Rudy Hinojosa
@BrokeMyLegBiking Das sollte laut MSDN nicht funktionieren : "IsDefaultPrinter gibt immer false zurück, wenn Sie die PrinterName-Eigenschaft explizit auf einen anderen Zeichenfolgenwert als null setzen."
jnm2
Sie können dies zu 'string pName = new PrinterSettings (). PrinterName;' verdichten.
PKanold
31

Ein anderer Ansatz ist die Verwendung von WMI (Sie müssen einen Verweis auf die System.Management-Assembly hinzufügen):

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
quelle
2
Verwenden der neuen PrinterSettings (). PrinterName gibt manchmal "Standarddrucker ist nicht festgelegt" als Druckernamen zurück, selbst wenn der Standarddrucker festgelegt wurde. Die obige WMI-Lösung von Nathan Baulch hat in einer solchen Situation für mich funktioniert.
Peter
13

Wenn Sie nur den Druckernamen wollen, ist das überhaupt kein Vorteil. WMI kann jedoch eine ganze Reihe anderer Druckereigenschaften zurückgeben:

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

und nicht nur Drucker. Wenn Sie an computerbezogenen Daten interessiert sind, können Sie diese wahrscheinlich mit WMI abrufen. WQL (die WMI-Version von SQL) ist auch einer seiner Vorteile.


quelle
10

Ich verwende in diesem Fall immer den System.Printing.LocalPrintServer, mit dem auch ermittelt werden kann, ob der Drucker lokal, im Netzwerk oder per Fax ist.

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

oder mit einer statischen Methode GetDefaultPrintQueue

LocalPrintServer.GetDefaultPrintQueue().FullName
Alexander Zwitbaum
quelle
2

Versuchen Sie auch dieses Beispiel

 PrinterSettings printerName = new PrinterSettings();

 string defaultPrinter;

 defaultPrinter = printerName.PrinterName;
Ramgy Borja
quelle
1

Das sollte funktionieren:

using System.Drawing.Printing;

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

Tahir
quelle
0
  • 1. Erstellen Sie eine Instanz des PrintDialogObjekts.
  • Rufen Sie dann das Druckdialogobjekt auf und lassen Sie das PrinterNameFeld leer. Dadurch gibt das Windows-Objekt den Standarddruckernamen zurück
  • Schreiben Sie dies in eine Zeichenfolge und verwenden Sie es als Druckernamen, wenn Sie die Druckprozedur aufrufen

Code:

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
quelle