it-swarm.cn

在.NET中获取默认打印机的最佳方法是什么

我需要获取默认的打印机名称。我将使用C#,但我怀疑这更像是一个框架问题而且不是特定于语言的。

71
Kevin Gale

我找到的最简单的方法是创建一个新的PrinterSettings对象。它以所有默认值开头,因此您可以检查其 Name property以获取默认打印机的名称。

PrinterSettings位于命名空间System.Drawing.Printing中的System.Drawing.dll中。

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

或者,您可以使用静态PrinterSettings.InstalledPrinters方法获取所有打印机名称的列表,然后设置 PrinterName property并检查 IsDefaultPrinter 。我没试过这个,但是文档似乎暗示它不起作用。显然 IsDefaultPrinter 仅在 PrinterName 未明确设置时才为真。

110
OwenP

另一种方法是使用WMI(您需要添加对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;
}
28
Nathan Baulch

如果您只是希望打印机名称没有任何优势。但WMI能够返回一大堆其他打印机属性:

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

而不仅仅是打印机。如果您对任何类型的计算机相关数据感兴趣,您可以通过WMI获得它。 WQL(SQL的WMI版本)也是它的优势之一。

11
Uros Calakovic

我总是在这种情况下使用System.Printing.LocalPrintServer,这也可以获得打印机是本地,网络还是传真。

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

或使用静态方法GetDefaultPrintQueue

LocalPrintServer.GetDefaultPrintQueue().FullName
9
Alexander Zwitbaum

也尝试这个例子

 PrinterSettings printerName = new PrinterSettings();

 string defaultPrinter;

 defaultPrinter = printerName.PrinterName;
1
Ramgy Borja
  • 1st创建PrintDialog对象的实例。
  • 然后调用打印对话框对象并将PrinterName留空。这将导致windows对象返回defualt打印机名称
  • 将其写入字符串并在调用打印过程时将其用作打印机名称

码:

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

这应该工作:

using System.Drawing.Printing;

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

0
Tahir