【问题标题】:Identify the original printer识别原始打印机
【发布时间】:2013-04-09 12:09:01
【问题描述】:

我正在枚举 PC 中连接的打印机。我使用 C# System.Printing 命名空间完成了它。 它运作良好。但主要是显示软件打印机,如 Microsoft XPS Document writer、Microsoft Fax 等。我想知道是否可以从枚举中删除这些软件打印机。我所做的代码如下所示:

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;
    }
}

【问题讨论】:

    标签: c# printers


    【解决方案1】:

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

    复杂之处在于网络打印机。确定网络打印机是否使用硬件端口并不容易。

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

    【讨论】:

    • 在过去的几天里,我对此进行了很多思考,我想我知道 Windows 打印子系统以及 Microsoft 以外的任何人,而且......好吧,恐怕我认为没有办法在所有情况下都能可靠地区分硬件和虚拟打印机。我可以给你一个“通常正确”的解决方案,但我认为不可能有一个“永远正确”的解决方案。对不起。 :-(
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      几个观察:

      1. Properties 窗口中,Device Settings 页面仅适用于真实打印机,不适用于虚拟打印机。而且这些值大部分都在printQueue.UserPrintTicket 属性中提供

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

      【讨论】:

      • 打印驱动程序和端口监视器控制这两个东西,可以为所欲为。我可以向您展示与您的发现不符的示例。
      • @CareyGregory:会检查一下..谢谢!
      • @Zigma:抱歉,我没有观察到,它是否也包含IP 地址?任何你能指点我的司机..
      • 不仅仅是端口名。端口将是网络路由器或类似的东西。
      • @Zigma:好的。我的目标只是hint,这可能是过滤掉事情的可能情况。
      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-11
        • 2011-02-08
        相关资源
        最近更新 更多