Определите исходный принтер

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

Ответы

Ответ 1

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

Ответ 2

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

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

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

Ответ 3

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

  • В окне Properties страница Device Settings доступна ТОЛЬКО для настоящих принтеров и НЕ для виртуальных принтеров. И большинство этих значений доступны в printQueue.UserPrintTicket свойстве

  • printQueue.QueuePort.Name содержит адрес IP, добавленный с именем порта или без него. ex: "20.120.12.22_1" или "20.120.12.22" для реальных принтеров

enter image description here

Ответ 4

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