我需要获取默认打印机名称。我将使用 C#,但我怀疑这更像是一个框架问题,而不是特定于语言的。
7 回答
我发现最简单的方法是创建一个新PrinterSettings
对象。它以所有默认值开头,因此您可以检查其Name属性以获取默认打印机的名称。
PrinterSettings
位于命名空间中的 System.Drawing.dll 中System.Drawing.Printing
。
PrinterSettings settings = new PrinterSettings();
Console.WriteLine(settings.PrinterName);
或者,您可以使用静态PrinterSettings.InstalledPrinters
方法获取所有打印机名称的列表,然后设置PrinterName属性并检查IsDefaultPrinter。我没有尝试过,但文档似乎表明它不起作用。显然IsDefaultPrinter仅在未明确设置PrinterName时为真。
另一种方法是使用 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
也试试这个例子
PrinterSettings printerName = new PrinterSettings();
string defaultPrinter;
defaultPrinter = printerName.PrinterName;
这应该有效:
using System.Drawing.Printing;
PrinterSettings settings = new PrinterSettings();
string defaultPrinterName = settings.PrinterName;
- 1st创建
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