是否有可能将虚拟打印机与物理打印机区分开来?

Posted

技术标签:

【中文标题】是否有可能将虚拟打印机与物理打印机区分开来?【英文标题】:Is there a possibility to differ virtual printer from physical one? 【发布时间】:2010-02-24 16:49:47 【问题描述】:

我有一个 WinXP 中所有可用打印机的列表。我需要代码(最好是 .NET)来过滤掉这个列表中的所有虚拟打印机。有可能吗?我分析了 Win32_Printer wmi 类的所有属性,但找不到合适的。

【问题讨论】:

【参考方案1】:

我认为这是不可能的,至少可以肯定。虚拟打印机的全部意义在于尽可能地模仿真实打印机,因此您可以识别的任何差异基本上都只是虚拟打印机中的错误。

也就是说,您可以根据PortName 进行一些猜测。仅举几个例子,包含 IP 地址或以“USB”开头的PortName 可能指的是物理连接。

【讨论】:

很好的答案,杰瑞。拉了几个例子,发现不可能。关于您的猜测建议,有一个警告:传真。我们的其中一台 PC 具有直接连接的传真/打印机,每台都列为单独的打印机(例如 HPFAX1、USB001)。但是,内置 MS 传真被列为 SHRFAX。我想其他虚拟传真也会以类似方式列出。此外,根据我所做的研究,即使不使用 WMI 也可能无法找到此信息。【参考方案2】:

我知道这是一个老问题,但这个答案可能对遇到同样问题的人有所帮助。

如果我对“虚拟打印机”的理解是正确的。您可以检查 WMI 属性“PrintProcessor”并忽略“winprint”。据我所知,这将忽略所有基于 Windows 7 软件的打印机选项。这是一些示例代码来证明这一点。返回打印机名称。

        using System.Management;

        try
        
            ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_Printer");

            foreach (ManagementObject obj in searcher.Get())
            
                if(obj != null)
                
                    if(obj["PrintProcessor"].ToString().ToUpper() != "WINPRINT")
                    
                        Console.WriteLine(obj["Name"]);
                    
                
            
        
        catch (ManagementException e)
        
            MessageBox.Show("An error occurred while querying for WMI data: " + e.Message);
        

【讨论】:

【参考方案3】:

我有一个收集硬件信息的项目 在测试HiTech 答案后,我看到一些与 LPT 连接的旧打印机(例如 Windows 10 上的 HP 2014)具有 WINPRINT PrintProcessor,并且这些打印机直接连接到计算机而不是虚拟的。所以我结合了本地、网络和端口名称属性(提供Jerry Coffin 答案)来查找更准确的本地和网络打印机(不是虚拟打印机)。

using System.Management;

class Printer

    public string Name  get; set; 
    public string Status  get; set; 
    public bool Default  get; set; 
    public bool Local  get; set;   
    public bool Network  get; set;         
    public string PrintProcessor  get; set; 
    public string PortName  get; set; 


private void btnGetPrinters_Click(object sender, EventArgs e)
          
    List<Printer> printers = new List<Models.Printer>();
    var query = new ManagementObjectSearcher("SELECT * from Win32_Printer");
    foreach (var item in query.Get())
    
        string portName = item["PortName"].ToString().ToUpper();
        if (((bool)item["Local"]==true || (bool)item["Network"]==true) &&  (portName.StartsWith("USB") || portName.StartsWith("LPT")))
        
            Printer p = new Models.Printer();
            p.Name = (string)item.GetPropertyValue("Name");
            p.Status = (string)item.GetPropertyValue("Status");
            p.Default = (bool)item.GetPropertyValue("Default");
            p.Local = (bool)item.GetPropertyValue("Local");
            p.Network = (bool)item.GetPropertyValue("Network");                    
            p.PrintProcessor = (string)item.GetPropertyValue("PrintProcessor");
            p.PortName = (string)item.GetPropertyValue("PortName");
            printers.Add(p);
        
    

    // Show on GridView 
    gv.DataSource = printers;

此方法适用于通过 USB 和 LPT 连接的打印机。我对其他端口(例如某些传真端口)一无所知。

【讨论】:

以上是关于是否有可能将虚拟打印机与物理打印机区分开来?的主要内容,如果未能解决你的问题,请参考以下文章

Linux虚拟机ping不通物理机

word文件用pdf虚拟打印机转换成PDF后,图片都不清晰怎么办 很急

虚拟内存或物理内存

java打印出某一指定路径下的文件夹内的所有子文件夹和文件,并区分开来

PrintQueue或PrintTicket是否有任何属性或方法来确定所选的打印机是虚拟打印机?

远程桌面 虚拟打印 到本地打印机(虚拟化 终端 远程接入 RemoteApp)