C# WinForms打印到默认打印机,即使它是';s不可用/未连接
如何确定打印机是否已连接 通常,此应用程序打印到默认打印机,但在某些情况下,该打印机可能不可用。如果是这样,我不希望作业发送到它的队列,而是希望打印到另一台可用的打印机 我了解PrinterSettings.InstalledPrinters属性。如果打印机不可用,PrintDocument.PrinterSettings.IsValid是否返回false WPF是否提供这种功能 我的问题与使用WMI和类不同,我应该能够检查Availability属性以查看打印机是否联机 这个问题和答案有助于:C# WinForms打印到默认打印机,即使它是';s不可用/未连接,c#,.net,winforms,printing,C#,.net,Winforms,Printing,如何确定打印机是否已连接 通常,此应用程序打印到默认打印机,但在某些情况下,该打印机可能不可用。如果是这样,我不希望作业发送到它的队列,而是希望打印到另一台可用的打印机 我了解PrinterSettings.InstalledPrinters属性。如果打印机不可用,PrintDocument.PrinterSettings.IsValid是否返回false WPF是否提供这种功能 我的问题与使用WMI和类不同,我应该能够检查Availability属性以查看打印机是否联机 这个问题和答案有助于:
首先,IsValid检查PrinterName属性的值是否有效,而不是检查打印机是否已连接 第二,在WPF中很容易做到这一点
var defaultPrintQueue = LocalPrintServer.GetDefaultPrintQueue();
if (!defaultPrintQueue.IsNotAvailable)
{
//print stuff
}
有关更多详细信息,请查看:
在winforms中,这有点困难,但您可以使用。参考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();
该对象描述了一些我们可以查看的有用结构;打印机状态和工作线。我们可以使用这些来编写一个实用程序类来检查打印机的可用性,也可以检查它的workffline状态
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
}
}
}
希望这有帮助您是否尝试过从PrintDialog的角度进行探索?PrintDialog.PrinterSettings.IsDefaultPrinter…然后如何检查它是否使用PrinterSettings类连接?要求我们不会使用PrintDialog。我在windows 7上尝试过,Availability属性似乎返回null。不过,PrinterStatus的工作非常出色。不幸的是,这可能取决于打印机。该应用程序将仅在XP 64位上运行。我会在有时间时尽快尝试。