Ответ 1
Единственный способ, которым я нашел, - сравнить имя требуемого принтера с тем, которое мы получаем.
Я перечисляю принтеры, подключенные к ПК. Я сделал это с использованием пространства имен С# System.Printing
.
Это работает хорошо. Но в основном это показывает программные принтеры, такие как Microsoft XPS Document writer, Microsoft Fax и т.д. Я хотел бы знать, можно ли удалить эти ssoftware принтеры из перечисления. Код, который я сделал, показан ниже:
PrintQueue printQueue = null;
LocalPrintServer localPrintServer = new LocalPrintServer();
// Retrieving collection of local printer on user machine
PrintQueueCollection localPrinterCollection =
localPrintServer.GetPrintQueues(new[] { EnumeratedPrintQueueTypes.Local,
EnumeratedPrintQueueTypes.Connections });
System.Collections.IEnumerator localPrinterEnumerator =
localPrinterCollection.GetEnumerator();
while (localPrinterEnumerator.MoveNext())
{
// Get PrintQueue from first available printer
printQueue = (PrintQueue)localPrinterEnumerator.Current;
if (!printQueue.IsOffline)
{
MessageBox.Show(printQueue.FullName.ToString());
string s = "Printer found " + printQueue.FullName.ToString();
listBox1.Items.Add(s);
}
else
{
// No printer exist, return null PrintTicket
// return null;
}
}
Единственный способ, которым я нашел, - сравнить имя требуемого принтера с тем, которое мы получаем.
Ключом к отличию реального принтера от виртуального принтера является порт, который использует принтер. Реальные принтеры используют аппаратные порты, такие как LPT1: или USB-порты. Виртуальные принтеры используют программные порты.
Усложнением будут сетевые принтеры. Нелегко будет определить, использует ли сетевой принтер аппаратный порт.
Я знаю, что это не отличный ответ, но вы задали очень сложный вопрос. Надеюсь, он начнется в правильном направлении.
Несколько наблюдений:
В окне Properties
страница Device Settings
доступна ТОЛЬКО для настоящих принтеров и НЕ для виртуальных принтеров. И большинство этих значений доступны в printQueue.UserPrintTicket
свойстве
printQueue.QueuePort.Name
содержит адрес IP
, добавленный с именем порта или без него. ex: "20.120.12.22_1" или "20.120.12.22" для реальных принтеров
Вы можете использовать Print Spooler API для управления принтерами и печатными машинами. Специально для вас может быть полезной функция EnumPrinters. Вы можете захватить оболочку С# из Pinvoke.net