什么';这是在.NET中获取默认打印机的最佳方法
我需要获取默认的打印机名称。我将使用C#但我怀疑这更像是一个框架问题,不是特定于语言的。我发现的最简单的方法是创建一个新的什么';这是在.NET中获取默认打印机的最佳方法,.net,.net,我需要获取默认的打印机名称。我将使用C#但我怀疑这更像是一个框架问题,不是特定于语言的。我发现的最简单的方法是创建一个新的PrinterSettings对象。它以所有默认值开始,因此您可以检查其Name属性以获取默认打印机的名称 PrinterSettings位于命名空间System.Drawing.Printing中的System.Drawing.dll中 PrinterSettings settings = new PrinterSettings(); Console.WriteLine(s
PrinterSettings
对象。它以所有默认值开始,因此您可以检查其Name属性以获取默认打印机的名称
PrinterSettings
位于命名空间System.Drawing.Printing
中的System.Drawing.dll中
PrinterSettings settings = new PrinterSettings();
Console.WriteLine(settings.PrinterName);
或者,您可以使用static
PrinterSettings.InstalledPrinters
方法获取所有打印机名称的列表,然后设置PrinterName属性并检查IsDefaultPrinter。我还没有尝试过这个,但文档似乎表明它不起作用。显然,IsDefaultPrinter仅在未显式设置PrinterName时才为真。另一种方法是使用WMI(您需要添加对System.Management程序集的引用):
如果你只是想知道打印机的名称,那就没有任何优势了。但是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
- 然后调用打印对话框对象并将
留空。这将导致windows对象返回已解除的打印机名称PrinterName
- 将其写入字符串,并在调用打印过程时将其用作打印机名称
在本例中,我始终使用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设置=新的PrinterSettings();
字符串defaultPrinterName=settings.PrinterName代码>也许值得一提的是,从InstalledPrinters返回的字符串的大小写可能与PrinterName属性不同。例如,此测试在我的系统上失败:Dim ps As New PrinterSettings Dim foundDefault As Boolean=False,每个打印机作为PrinterSettings.InstalledPrinters中的字符串,如果printer=ps.PrinterName,则foundDefault=True如果Next Assert.IsTrue(foundDefault)以下是循环技术,对我来说很有效:foreach(PrinterSettings.InstalledPrinters中的字符串名称){PrinterSettings ps=new PrinterSettings();ps.PrinterName=name;if(ps.IsDefaultPrinter)返回名称;}返回null;请注意,如果您将应用程序作为windows服务运行,则此方法不起作用。我还不知道为什么。我正在作为本地服务运行。@BrokerMyLegbiking不应该工作:“当您显式地将PrinterName属性设置为非null的字符串值时,IsDefaultPrinter始终返回false。”您可以将其压缩为“string pName=new PrinterSettings().PrinterName;”使用新的PrinterSettings()。PrinterName有时会返回“未设置默认打印机”作为打印机名称,即使已设置默认打印机也是如此。Nathan Baulch提供的上述WMI解决方案在这种情况下对我有效。
LocalPrintServer.GetDefaultPrintQueue().FullName
PrinterSettings printerName = new PrinterSettings();
string defaultPrinter;
defaultPrinter = printerName.PrinterName;