2013-04-09 3 views
15

Я перечисляю принтеры, подключенные к ПК. Я сделал это с использованием пространства имен C# 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; 
    } 
} 

ответ

6

Единственный способ, которым я нашел, это сравнить имя требуемого принтера с тем, которое мы получаем.

12

Ключ к отличить реальный принтер от виртуального принтера порт принтер использует. Реальные принтеры используют аппаратные порты, такие как LPT1: или USB-порты. Виртуальные принтеры используют программные порты.

Усложнение будет сетевым принтером. Нелегко будет определить, использует ли сетевой принтер аппаратный порт.

Я знаю, что это не отличный ответ, но вы задали очень сложный вопрос. Надеюсь, он начнется в правильном направлении.

+0

Очень забавно, что я пользуюсь сетевым принтером :) – Zigma

+1

Я много думал об этом за последние несколько дней, и я думаю, что знаю подсистему печати Windows, а также кто-то за пределами Microsoft, и ... ну, боюсь, я не думаю, что есть способ надежно различать аппаратное обеспечение и виртуальный принтер во всех случаях. Я мог бы дать вам «обычно правильное» решение, но я не думаю, что «всегда правильное» решение возможно. Сожалею. :-( –

3

Несколько наблюдений:

  1. Properties В окне Page Device Settings доступна только для реальных принтеров, а не для виртуальных принтеров. И большинство из этих значений доступны в printQueue.UserPrintTicket собственности

  2. printQueue.QueuePort.Name содержит IP адрес прилагаемого с или без имени порта. например: "20.120.12.22_1" или "20.120.12.22" для настоящих принтеров

enter image description here

+0

Драйвер принтера и монитор порта контролируют обе эти вещи и могут делать как угодно. Я могу показать вам примеры, которые не соответствуют вашим выводам. –

+0

@CareyGregory: Будет ли это проверено. Спасибо! Спасибо! –

+0

Это неправильно. программные принтеры имеют также порты с ними. – Zigma

2

Вы можете использовать Print Spooler API для управления принтерами и printjobs. Специально для вас может быть полезной функция EnumPrinters. Вы можете захватить оболочку C# от Pinvoke.net

 Смежные вопросы

  • Нет связанных вопросов^_^