gpt4 book ai didi

c# - WinForms 打印到默认打印机,即使它不可用/未连接

转载 作者:行者123 更新时间:2023-11-30 22:46:27 25 4
gpt4 key购买 nike

如何确定打印机是否已连接?

通常此应用程序打印到默认打印机,但在某些情况下该打印机可能不可用。如果是这样,我不想将作业发送到它的队列,而是打印到另一台可用的打印机。

我了解 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更多详情:在 winform 中,它有点难,但你可以使用 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
}
}
}

希望对你有帮助

关于c# - WinForms 打印到默认打印机,即使它不可用/未连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2642257/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com