当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《在.NET中获取默认打印机的最佳方法是什么》经验,为你挑选了4个好方法。

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



1> OwenP..:

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

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

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

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


也许值得一提的是,InstalledPrinters返回的字符串可能与PrinterName属性具有不同的外壳.例如,此测试在我的系统上失败:Dim ps As New PrinterSettings Dim foundDefault As Boolean = False For Each Printer As String in PrinterSettings.InstalledPrinters如果printer = ps.PrinterName Then foundDefault = True End If If Assert.IsTrue(foundDefault)

2> Nathan Baulc..:

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


使用新的PrinterSettings().PrinterName有时会返回"默认打印机未设置"作为打印机名称,即使已设置默认打印机HAS.Nathan Baulch的上述WMI解决方案在这样的情况下为我工作.

3> 小智..:

如果您只是希望打印机名称没有任何优势.但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版本)也是它的优势之一.



4> Alexander Zw..:

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

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

或使用静态方法GetDefaultPrintQueue

LocalPrintServer.GetDefaultPrintQueue().FullName

推荐阅读
coco2冰冰
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有