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

时间:2020-03-05 18:59:37  来源:igfitidea点击:

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

解决方案

回答

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

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

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

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

回答

另一种方法是使用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;
}

回答

如果我们只想使用打印机名称,那根本没有优势。但是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版本)也是其优点之一。

回答

  • 第一个创建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