我需要获取默认的打印机名称.我将使用C#,但我怀疑这更像是一个框架问题而且不是特定于语言的.
我发现最简单的方法是创建一个新PrinterSettings
对象.它以所有默认值开头,因此您可以检查其Name属性以获取默认打印机的名称.
PrinterSettings
在命名空间中的System.Drawing.dll中System.Drawing.Printing
.
PrinterSettings settings = new PrinterSettings(); Console.WriteLine(settings.PrinterName);
或者,您可以使用静态PrinterSettings.InstalledPrinters
方法获取所有打印机名称的列表,然后设置PrinterName属性并检查IsDefaultPrinter.我没试过这个,但是文档似乎暗示它不起作用.显然IsDefaultPrinter仅在未明确设置PrinterName时才为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版本)也是它的优势之一.
我总是在这种情况下使用System.Printing.LocalPrintServer,这也可以获得打印机是本地,网络还是传真.
string defaultPrinter; using(var printServer = new LocalPrintServer()) { defaultPrinter = printServer.DefaultPrintQueue.FullName); }
或使用静态方法GetDefaultPrintQueue
LocalPrintServer.GetDefaultPrintQueue().FullName