我正在构建一个简单的程序,当它运行时,它会显示不同的计算机组件。
现在我正在尝试显示所有插入的显示器。每个的名称以及插入计算机的总数量。
当我运行下面的代码时,即使我插入了三台显示器,它也只显示一台显示器的名称。有人可以告诉我为什么。
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 示例)