如何使用 WMI 获取所有连接的监视器的监视器信息



我正在构建一个简单的程序,当它运行时,它会显示不同的计算机组件。

现在我正在尝试显示所有插入的显示器。每个的名称以及插入计算机的总数量。

当我运行下面的代码时,即使我插入了三台显示器,它也只显示一台显示器的名称。有人可以告诉我为什么。

public static List<string> GetMonitorNames()
{
    ManagementClass mc = new ManagementClass("Win32_DesktopMonitor");
    ManagementObjectCollection moc = mc.GetInstances();
    var info = new List<string>();
    foreach (ManagementObject mo in moc)
    {
        info.Add(mo["Name"].ToString());
    }
    return info;
}

您可以使用 WmiMonitorBasicDisplayParams 方法获取所有监控器的实例名称。

这是一个例子

public static List<string> GetMonitorNames()
{
    ManagementObjectSearcher searcher =
            new ManagementObjectSearcher("root\WMI",
            "SELECT * FROM WmiMonitorBasicDisplayParams");
    var info = new List<string>();
    foreach (ManagementObject queryObj in searcher.Get()) { 
        info.Add(queryObj["InstanceName"].ToString());
    }
    return info;
}

我的机器的示例输出和此对象的可用属性

Active                        : True
DisplayTransferCharacteristic : 120
InstanceName                  : DISPLAYHWP32704&7563392&0&UID16843008_0
MaxHorizontalImageSize        : 52
MaxVerticalImageSize          : 32
SupportedDisplayFeatures      : WmiMonitorSupportedDisplayFeatures
VideoInputType                : 0
PSComputerName                :
Active                        : True
DisplayTransferCharacteristic : 120
InstanceName                  : DISPLAYHWP326E4&7563392&0&UID53349120_0
MaxHorizontalImageSize        : 52
MaxVerticalImageSize          : 32
SupportedDisplayFeatures      : WmiMonitorSupportedDisplayFeatures
VideoInputType                : 1
PSComputerName                :

不是对所提出问题的直接回答,而是顺从 WMI,为什么不使用 .net 中可用的解决方案,如以下 Winforms 解决方案:

using System.Diagnostics;
using System.Windows.Forms;
Debug.Print("Total Number Of Monitors: {0}", Screen.AllScreens.Length);
foreach (Screen scr in Screen.AllScreens)
{
    Debug.Print(scr.DeviceName);
}

根据您的评论进行澄清,是的,该方法可以从静态方法中使用,如下所示:

public static List<string> GetAllMonitorNames()
{
    List<string> result = new List<string>();
    foreach (Screen scr in Screen.AllScreens)
    {
        result.Add(scr.DeviceName);
    }
    return result;
}

或者如果您愿意,请使用 LINQ:

public static IEnumerable<string> GetAllMonitorNames() => 
            Screen.AllScreens.Select((s) => s.DeviceName);

您仍然可以只P/调用API的EnumDisplayMonitors,并将显示名称添加到列表中。(pinvoke.net 示例)

最新更新