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

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

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

PrinterSettings位于名为System.Drawing.Printing的System.Drawing.Printing

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

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

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

而不仅仅是打印机。 如果您对任何types的计算机相关数据感兴趣,可以通过WMI获得。 WQL(SQL的WMI版本)也是它的优势之一。

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

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

或者使用静态方法GetDefaultPrintQueue

 LocalPrintServer.GetDefaultPrintQueue().FullName 
  • 首先创buildPrintDialog对象的一个​​实例。
  • 然后调用打印对话框对象并将PrinterName留空。 这将导致窗口对象返回错误的打印机名称
  • 把它写成一个string,并在打印过程中使用它作为打印机名称

码:

 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 

试试这个例子

  PrinterSettings printerName = new PrinterSettings(); string defaultPrinter; defaultPrinter = printerName.PrinterName;