在.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