使用.NET / WMI获取PC的显示器信息

7

有没有使用WMI/.Net获取显示器信息,例如制造商、序列号、显示器大小等的方法?

使用脚本也是一种选择,或者我可以直接查询注册表以获取此信息吗?

SELECT * FROM Win32_DesktopMonitor在这种情况下并没有为我提供有用的信息。

4个回答

12

嘿,我在很多WMI工作中都使用这个工具,特别是在原型和创建POC时......

Microsoft WMI代码生成器

这个工具非常适合在C#和VB.NET中为任何WMI查询或方法调用创建快速控制台应用程序代码。

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

            foreach (ManagementObject queryObj in searcher.Get())
            {
                Console.WriteLine("-----------------------------------");
                Console.WriteLine("Win32_DesktopMonitor instance");
                Console.WriteLine("-----------------------------------");
                Console.WriteLine("Description: {0}", queryObj["Description"]);
            }
        }
        catch (ManagementException e)
        {
            MessageBox.Show("An error occurred while querying for WMI data: " + e.Message);
        }

以上代码将为您获取显示器的制造商和型号。


1
FYI,Win32_DesktopMonitor似乎无法获取所有监视器。来自root\WMI的WMIMonitorID似乎可以获取更多/全部。 - Tydaeus

6

@TamirVered...第一个链接看起来有问题。 - LarsTech
未找到http://myitforum.com/cs2/blogs/rzander/archive/2009/03/30/wmi-provider-to-list-the-monitors-serialnr-and-model-name.aspx相关内容。 - Kiquenet
这个脚本已经添加了8年多了,但是我已经从Github上更新了一个新的脚本。希望能有所帮助。 - Iain

2
那个选择查询应该能给你想要的结果。这里是包含查询详细信息的文档(点击此处)
然后你可以像这样做:
    public void GetMonitorDetails()
    {
       using(ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_DesktopMonitor")
       {
          foreach(ManagementObject currentObj in searcher.Get())
          {
             String name = currentObj("Name").ToString();
             String device_id = currentObj("DeviceID").ToString();
             // ...
          }
       }
    }

这就是我在问题中列出的查询,它不起作用 :)! - mint
它没有给我想要的很多信息(序列号、显示器尺寸),虽然它说是监视器制造商,但其值是:<标准监视器类型>,这不是我要找的。 - mint
@snow:这可能是由于您机器上当前安装的显示器引起的...请在设备管理器中查看当前安装的显示器的详细信息并进行比较。 - Xander
Win32_DesktopMonitor无法列出所有连接的监视器。目前我连接了10个监视器,并且它们都正常运行,但是此查询仅列出其中4个。 - Roni Tovi
@Kiquenet 是的,它是一个只使用1台电脑的视频墙应用程序。 - Roni Tovi
显示剩余2条评论

0

这篇文章和下面关于WMI管理工具的回答使我找到了答案。这是一段返回您监视器分辨率的代码。

try {                 
        ManagementObjectSearcher searcher =
            new ManagementObjectSearcher("root\\WMI",
            "SELECT * FROM WmiMonitorBasicDisplayParams");    

        foreach (ManagementObject queryObj in searcher.Get()) {
            Debug.WriteLine("-----------------------------------");
            Debug.WriteLine("WmiMonitorBasicDisplayParams instance");
            Debug.WriteLine("-----------------------------------");
            Debug.WriteLine("Description: {0}", queryObj["SupportedDisplayFeatures"]);
        }
    } catch (ManagementException e) {
        MessageBox.Show("An error occurred while querying for WMI data: " + e.Message);
    }

在我的情况下,我仍然卡住了,因为它返回每个显示器的“缩小”分辨率。我的其中一个是4K显示器,被报告为2560x1440。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接