【问题标题】:Does PrintQueue or PrintTicket has any property or method to determine the selected printer is a virtual printer?PrintQueue 或 PrintTicket 是否有任何属性或方法来确定所选打印机是虚拟打印机?
【发布时间】:2018-03-06 08:29:29
【问题描述】:

PrintQueue 或 PrintTicket 是否有任何属性或方法来确定所选打印机是虚拟打印机? 例如,该进程应限制 M/S Xps Document Writer、Fax、Send To OneNote、PDF Printer 等。 只有实际的打印机应该从 LocalPrintServer 中过滤掉并动态提供一个列表。

    using (var _LocalPrintServer = new LocalPrintServer())
    {
        foreach (PrintQueue _pq in _LocalPrintServer.GetPrintQueues())
        {
            // To Find some way to determine this _pq is NOT a virtual printer
        }
    }

【问题讨论】:

  • 你看文档了吗,这就是我们必须做的事情
  • 我的感觉是这不容易确定,如果有某种方法可以做到这一点,您将需要使用 WMI 和打印机类,并且可能不会 100% 可靠msdn.microsoft.com/en-us/library/aa394363(v=vs.85).aspx
  • 我试图参考很多博客,但我没有找到我真正需要的。问题是我需要找到本地安装的物理打印机,而不是那些保存页面并需要用户交互来提供文件名的打印机,再次不是“传真”项目。同样,如果 System.Drawing.Printing 中的任何组件可以为我提供对我来说应该没问题的预期结果。谢谢!

标签: c# printing printqueue


【解决方案1】:

您需要探测Win32_Printer 类中的属性

System.Management.ObjectQuery oq = new System.Management.ObjectQuery("SELECT * FROM Win32_Printer");
ManagementObjectSearcher mos = new ManagementObjectSearcher(oq);
ManagementObjectCollection moc = mos.Get();
foreach( ManagementObject mo in moc )
{

    string name = mo["Name"].ToString();
    string language = mo["DefaultLanguage"].ToString();
    MessageBox.Show(String.Format("Printer: {0} -- Language: {1}", name, language);
}

也许您可以检查languages 字段中的postscipt 或pcl(只是一个猜测),尽管您可能只需要检查所有打印机之间的差异以找到一种松散的指示方式。

在任何情况下,我都可以相当自信地没有办法准确检查您想要的东西,因为没有关于您的规格的称为虚拟打印机的字段。

【讨论】:

  • 感谢迈克尔的回复。我会相应地研究并让您更新。感谢您的洞察力。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-24
  • 1970-01-01
  • 1970-01-01
  • 2013-04-29
  • 1970-01-01
相关资源
最近更新 更多