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

时间:2010-02-24 16:49:48

标签: c# .net winapi wmi

我有WinXP中所有可用打印机的列表。我需要代码(理想情况下是.NET)来过滤掉此列表中的所有虚拟打印机。有可能吗?我分析了Win32_Printer wmi类的所有属性,但看不到任何合适的属性。请帮忙。

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:3)

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

如果我理解了一台虚拟打印机"是正确的。您可以检查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);
        }

答案 2 :(得分:1)

我有一个收集硬件信息的项目 在测试了HiTech答案之后,我看到一些与LPT连接的旧打印机(例如Windows 10上的HP 2014)具有WINPRINT PrintProcessor,并且这些打印机直接连接到计算机而不是虚拟的。因此,我结合了Local,Network和PortName属性(在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连接的打印机。我对其他端口(例如某些传真端口)一无所知。