15

我正在枚举 PC 中连接的打印机。我使用 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;
    }
}
4

4 回答 4

12

区分真实打印机和虚拟打印机的关键是打印机使用的端口。真正的打印机使用硬件端口,例如 LPT1: 或 USB 端口。虚拟打印机使用软件驱动的端口。

复杂的将是网络打印机。确定网络打印机是否使用硬件端口并不容易。

我知道这不是一个很好的答案,但你提出了一个非常困难的问题。我希望它能让你朝着正确的方向开始。

于 2013-04-13T01:06:14.603 回答
6

我发现的唯一方法是将所需打印机的名称与我们得到的打印机名称进行比较。

于 2013-05-23T09:22:55.087 回答
3

几点观察:

  1. Properties窗口中,Device Settings页面仅适用于真实打印机,不适用于虚拟打印机。并且这些值中的大多数都在printQueue.UserPrintTicket属性中可用

  2. printQueue.QueuePort.Name包含IP附加或不附加端口名称的地址。例如:真实打印机的“20.120.12.22_1”或“20.120.12.22”

在此处输入图像描述

于 2013-05-28T03:29:51.620 回答
2

您可以使用Print Spooler API来管理打印机和打印作业。特别是EnumPrinters函数可能对您有用。您可以从Pinvoke.net获取 c# 包装器

于 2013-05-28T21:19:40.237 回答