Сначала 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
}
}
}
Надеюсь, это поможет