【问题标题】:Get PC's Monitor Information Using .NET / WMI使用 .NET / WMI 获取 PC 的监视器信息
【发布时间】:2011-03-29 11:18:21
【问题描述】:

有没有使用 WMI/.Net 来获取监视器信息,例如制造商、序列号、监视器大小等?

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

SELECT * FROM Win32_DesktopMonitor 在这种情况下并没有真正为我返回任何有用的信息。

【问题讨论】:

    标签: c# .net wmi monitor


    【解决方案1】:

    【讨论】:

    【解决方案2】:

    This post,结合下面关于 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。

    【讨论】:

      【解决方案3】:

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

      Microsoft WMI Code Generator

      此工具非常适合为 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);
              }
      

      上面的代码将为您提供显示器的品牌和型号。

      【讨论】:

      • 仅供参考,Win32_DesktopMonitor 似乎无法获取所有监视器。来自 root\WMI 的 WMIMonitorID 似乎获得了更多/全部。
      【解决方案4】:

      那个选择查询应该给你你想要的。 Here 是包含查询详细信息的文档。

      然后你可以这样做:

          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();
                   // ...
                }
             }
          }
      

      【讨论】:

      • 这是我在问题中列出的查询不起作用:)!
      • 它没有给我很多我正在寻找的信息(序列号,显示器尺寸,它说显示器制造商,但它的值是:不是什么我一直在寻找。
      • @snow : 这可能是由于您的机器上当前安装了监视器...查看设备管理器以查看当前安装的监视器上的详细信息并进行比较。
      • Win32_DesktopMonitor 没有列出所有正在连接的监视器。目前我有 10 台显示器连接到我的电脑并正常运行,但此查询仅列出其中 4 台。
      • @RoniTovi 10 台显示器?
      猜你喜欢
      • 1970-01-01
      • 2012-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-06
      • 1970-01-01
      相关资源
      最近更新 更多