我在枚举连接在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;
}
}
答案 0 :(得分:12)
区分真实打印机和虚拟打印机的关键是打印机正在使用的端口。真正的打印机使用硬件端口,如LPT1:或USB端口。虚拟打印机使用软件驱动的端口。
复杂的是网络打印机。确定网络打印机是否使用硬件端口并不容易。
我知道这不是一个好的答案,但你提出了一个非常困难的问题。我希望它能让你开始朝着正确的方向前进。
答案 1 :(得分:6)
我找到的唯一方法是将所需打印机的名称与我们得到的打印机进行比较。
答案 2 :(得分:3)
很少有观察结果:
在Properties
窗口中,Device Settings
页面仅适用于Real Printers而不适用于虚拟打印机。大多数这些值都可以在printQueue.UserPrintTicket
属性
printQueue.QueuePort.Name
包含附加或不附加端口名称的IP
地址。例如:“真实打印机”的“20.120.12.22_1”或“20.120.12.22”
答案 3 :(得分:2)
您可以使用Print Spooler API管理打印机和打印作业。特别是EnumPrinters函数可能对您有用。您可以从Pinvoke.net
中获取c#包装器