如何确定打印机是否已连接?
通常,此应用程序打印到默认打印机,但在某些情况下,该打印机可能不可用。如果是这样,我不希望将作业发送到其队列,而是打印到另一台可用的打印机。
我了解 PrinterSettings.InstalledPrinters 属性。如果打印机不可用,PrintDocument.PrinterSettings.IsValid 是否返回 false?
WPF提供这种功能吗?
我的问题与 Printing problem in C# windows app - Always prints to default printer 不同
最佳答案
首先,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对象描述了一些我们可以查看的有用结构;打印机状态和脱机工作。我们可以使用它们编写一个实用程序类来检查打印机的可用性,还检查其 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
}
}
}
希望这有帮助
关于c# - WinForms 打印到默认打印机,即使它不可用/连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2642257/