如何确定打印机是否已连接?
通常,此应用程序会打印到默认打印机,但在某些情况下打印机可能无法使用。如果是这样,我不希望将作业发送到队列,而是打印到另一台可用的打印机。
我了解PrinterSettings.InstalledPrinters属性。如果打印机不可用,PrintDocument.PrinterSettings.IsValid是否返回false?
WPF是否提供此类功能?
我的问题与Printing problem in C# windows app - Always prints to default printer
不同答案 0 :(得分:3)
首先,IsValid检查PrinterName属性的值以查看它是否是有效值,而不是打印机是否已连接。
其次,在WPF中,这很容易做到;
var defaultPrintQueue = LocalPrintServer.GetDefaultPrintQueue();
if (!defaultPrintQueue.IsNotAvailable)
{
//print stuff
}
查看docs了解更多详情: 在winforms中,它有点难,但你可以使用WMI。参考System.Management.dll并添加以下using语句:
using System;
using System.Drawing.Printing;
using System.Windows.Forms;
using System.Management;
获取所有默认打印机:
注意以下代码可能在某种程度上取决于操作系统。查看MSDN文档..
var printerSearcher =
new ManagementObjectSearcher(
"SELECT * FROM Win32_Printer where Default = true"
);
return printerSearcher.Get();
WMI documentation for the printer对象描述了我们可以看到的一些有用的结构; PrinterStatus和WorkOffline。我们可以使用这些来编写实用程序类来检查打印机的可用性,还检查其WorkOffline状态......
public static class PrinterUtility
{
public static bool IsOnline(this ManagementBaseObject printer)
{
var status = printer["PrinterStatus"];
var workOffline = (bool)printer["WorkOffline"];
if (workOffline) return false;
int statusAsInteger = Int32.Parse(status.ToString());
switch (statusAsInteger)
{
case 3: //Idle
case 4: //Printing
case 5: //Warming up
case 6: //Stopped printing
return true;
default:
return false;
}
}
public static ManagementObjectCollection GetDefaultPrinters()
{
var printerSearcher =
new ManagementObjectSearcher(
"SELECT * FROM Win32_Printer where Default = true"
);
return printerSearcher.Get();
}
}
现在您可以将它与标准的WinForms System.Drawing.Printing代码结合起来:
//in a function, far far away from any button click handler :P
foreach(var printer in PrinterUtility.GetDefaultPrinters())
{
if (printer.IsOnline())
{
var pDoc = new PrintDocument(); //or get from PrintDialog
pDoc.PrinterSettings.PrinterName = printer["Name"].ToString();
if (pDoc.PrinterSettings.IsValid) //just check WMI didn't tell fibs about the name
{
//do printy things
}
}
}
希望这有帮助
答案 1 :(得分:0)
使用WMI和Win32_Printer类,我应该能够检查可用性属性以查看打印机是否在线。
这个问题和答案有所帮助:
how do i check if a printer is installed and ready using C#?
答案 2 :(得分:0)
您是否尝试从PrintDialog的角度进行探索? PrintDialog.PrinterSettings.IsDefaultPrinter ...