Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WinForms打印到默认打印机,即使它是';s不可用/未连接_C#_.net_Winforms_Printing - Fatal编程技术网

C# WinForms打印到默认打印机,即使它是';s不可用/未连接

C# WinForms打印到默认打印机,即使它是';s不可用/未连接,c#,.net,winforms,printing,C#,.net,Winforms,Printing,如何确定打印机是否已连接 通常,此应用程序打印到默认打印机,但在某些情况下,该打印机可能不可用。如果是这样,我不希望作业发送到它的队列,而是希望打印到另一台可用的打印机 我了解PrinterSettings.InstalledPrinters属性。如果打印机不可用,PrintDocument.PrinterSettings.IsValid是否返回false WPF是否提供这种功能 我的问题与使用WMI和类不同,我应该能够检查Availability属性以查看打印机是否联机 这个问题和答案有助于:

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

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

我了解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位上运行。我会在有时间时尽快尝试。