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

什么';这是在.NET中获取默认打印机的最佳方法,.net,.net,我需要获取默认的打印机名称。我将使用C#但我怀疑这更像是一个框架问题,不是特定于语言的。我发现的最简单的方法是创建一个新的PrinterSettings对象。它以所有默认值开始,因此您可以检查其Name属性以获取默认打印机的名称 PrinterSettings位于命名空间System.Drawing.Printing中的System.Drawing.dll中 PrinterSettings settings = new PrinterSettings(); Console.WriteLine(s

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

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

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

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

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

另一种方法是使用WMI(您需要添加对System.Management程序集的引用):


如果你只是想知道打印机的名称,那就没有任何优势了。但是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对象返回已解除的打印机名称
  • 将其写入字符串,并在调用打印过程时将其用作打印机名称
代码:


在本例中,我始终使用System.Printing.LocalPrintServer,这也可以获取打印机是本地打印机、网络打印机还是传真打印机

string defaultPrinter;
using(var printServer = new LocalPrintServer()) {
  defaultPrinter = printServer.DefaultPrintQueue.FullName);
}
或者使用静态方法GetDefaultPrintQueue

LocalPrintServer.GetDefaultPrintQueue().FullName
再试试这个例子

 PrinterSettings printerName = new PrinterSettings();

 string defaultPrinter;

 defaultPrinter = printerName.PrinterName;
这应该起作用:

使用System.Drawing.Printing

PrinterSettings设置=新的PrinterSettings();

字符串defaultPrinterName=settings.PrinterName

也许值得一提的是,从InstalledPrinters返回的字符串的大小写可能与PrinterName属性不同。例如,此测试在我的系统上失败:Dim ps As New PrinterSettings Dim foundDefault As Boolean=False,每个打印机作为PrinterSettings.InstalledPrinters中的字符串,如果printer=ps.PrinterName,则foundDefault=True如果Next Assert.IsTrue(foundDefault)以下是循环技术,对我来说很有效:foreach(PrinterSettings.InstalledPrinters中的字符串名称){PrinterSettings ps=new PrinterSettings();ps.PrinterName=name;if(ps.IsDefaultPrinter)返回名称;}返回null;请注意,如果您将应用程序作为windows服务运行,则此方法不起作用。我还不知道为什么。我正在作为本地服务运行。@BrokerMyLegbiking不应该工作:“当您显式地将PrinterName属性设置为非null的字符串值时,IsDefaultPrinter始终返回false。”您可以将其压缩为“string pName=new PrinterSettings().PrinterName;”使用新的PrinterSettings()。PrinterName有时会返回“未设置默认打印机”作为打印机名称,即使已设置默认打印机也是如此。Nathan Baulch提供的上述WMI解决方案在这种情况下对我有效。
LocalPrintServer.GetDefaultPrintQueue().FullName
 PrinterSettings printerName = new PrinterSettings();

 string defaultPrinter;

 defaultPrinter = printerName.PrinterName;