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

标签 c# .net winforms printing

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

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

我了解 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/

相关文章:

c# - 选项卡索引不适用于单选按钮

c# - 自动将命名空间添加到 Unity C# 脚本

c# - Azure SDK 2.9 诊断异常

c# - 如何使用 ABCpdf 将图像添加到 PDF 文档的专色 channel 中?

c# - 如何在 C# .NET 文档中添加换行符

c# - 如何在没有消息的情况下保存/覆盖现有的 Excel 文件

c# - 在 Controller 外调用 return RedirectToAction ("Activity")

c# - 使用 C# 在任务栏中时钟小工具

c# - 获取 MS Word 中呈现的文本和图像的高度

c# - 在数据库中发送带有附件路径的批量电子邮件