即使WinForms不可用/已连接,它也会打印到默认打印机

时间:2010-04-15 01:51:18

标签: c# .net winforms printing

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

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

我了解PrinterSettings.InstalledPrinters属性。如果打印机不可用,PrintDocument.PrinterSettings.IsValid是否返回false?

WPF是否提供此类功能?

我的问题与Printing problem in C# windows app - Always prints to default printer

不同

3 个答案:

答案 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 ...