WinForms печатает на принтер по умолчанию, даже если он недоступен / подключен - PullRequest
2 голосов
/ 15 апреля 2010

Как определить, подключен ли принтер?

Обычно это приложение печатает на принтере по умолчанию, но в некоторых случаях этот принтер может быть недоступен. Если это так, я не хочу, чтобы задание отправлялось в его очередь, а печаталось на другом доступном принтере.

Я понимаю свойство PrinterSettings.InstalledPrinters. Возвращает ли PrintDocument.PrinterSettings.IsValid значение false, если принтер недоступен?

Предоставляет ли WPF такую ​​функциональность?

Моя проблема отличается от Проблема печати в приложении C # windows - Всегда печатает на принтере по умолчанию

Ответы [ 3 ]

3 голосов
/ 15 апреля 2010

Сначала IsValid проверяет значение свойства PrinterName, чтобы узнать, является ли оно допустимым значением, а не подключен ли принтер.

Во-вторых, в WPF это очень легко сделать;

 var defaultPrintQueue = LocalPrintServer.GetDefaultPrintQueue();
 if (!defaultPrintQueue.IsNotAvailable)
 {
   //print stuff
 }

Проверьте документы для более подробной информации: В winforms это немного сложнее, но вы можете использовать WMI . Ссылка на System.Management.dll и добавьте следующие операторы:

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 для объекта принтера описывает некоторые полезные структуры, которые мы можем рассмотреть; 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. Код печати:

//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       
    }
  }
}

Надеюсь, это поможет

0 голосов
/ 15 апреля 2010

Вы пытались исследовать его с точки зрения PrintDialog? PrintDialog.PrinterSettings.IsDefaultPrinter ...

0 голосов
/ 15 апреля 2010

Используя WMI и класс Win32_Printer , я смогу проверить свойство Availability, чтобы увидеть, подключен ли принтер к сети.

Этот вопрос и ответ помогли:

как проверить, установлен ли и готов ли принтер с использованием C #?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...