我需要获取默认打印机的名称。我将使用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 没有任何优势。但是 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(WMI版本的SQL)也是它的优势之一。
在这种情况下,我总是使用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 settings = new PrinterSettings();
string defaultPrinterName = settings.PrinterName;
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