87

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

4

7 回答 7

140

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

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

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

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

于 2008-09-17T18:32:56.343 回答
32

另一种方法是使用 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;
}
于 2008-09-17T18:54:22.017 回答
13

如果您只想要打印机名称根本没有优势。但是 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 版本)也是它的优势之一。

于 2008-09-17T20:34:30.997 回答
10

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

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

或使用静态方法 GetDefaultPrintQueue

LocalPrintServer.GetDefaultPrintQueue().FullName
于 2012-03-06T16:35:11.087 回答
3

也试试这个例子

 PrinterSettings printerName = new PrinterSettings();

 string defaultPrinter;

 defaultPrinter = printerName.PrinterName;
于 2017-08-11T08:24:03.910 回答
1

这应该有效:

using System.Drawing.Printing;

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

于 2019-05-15T10:35:19.167 回答
0
  • 1st创建PrintDialog对象的一个​​实例。
  • 然后调用打印对话框对象并PrinterName留空。这将导致 windows 对象返回默认的打印机名称
  • 将其写入字符串并在调用打印过程时将其用作打印机名称

代码:

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
于 2008-12-11T10:51:39.293 回答