获取与在显示设置中找到的显示名称匹配的显示名称
本文关键字:显示 设置 获取 | 更新日期: 2023-09-27 18:09:11
在编写WPF应用程序时,我想获得在标准窗口显示设置对话框中找到的显示名称。我试过WMI查询Win32_DesktopMonitor和System.Windows.Forms.Screen.AllScreens.
显示在标准窗口显示设置列表中的名称如下:
Mobile PC Display
DELL 2407WFP
Win32_DesktopMonitor提供了以下(剥离不相关的信息):
DISPLAY 1
Caption = Generic PnP Monitor
CreationClassName = Win32_DesktopMonitor
Description = Generic PnP Monitor
DeviceID = DesktopMonitor1
MonitorManufacturer = (Standard monitor types)
MonitorType = Generic PnP Monitor
Name = Generic PnP Monitor
PNPDeviceID = DISPLAY'DELA017'5&2F0149CC&0&UID1078064
DISPLAY 2
Caption = Generic PnP Monitor
CreationClassName = Win32_DesktopMonitor
Description = Generic PnP Monitor
DeviceID = DesktopMonitor2
MonitorManufacturer = (Standard monitor types)
MonitorType = Generic PnP Monitor
Name = Generic PnP Monitor
PNPDeviceID = DISPLAY'CMO1720'4&164FD10C&0&UID67568640
System.Windows.Forms.Screen。AllScreens提供了一个设备列表(除去不相关的信息):
DISPLAY 1
DeviceName = ''.'DISPLAY1
DISPLAY 2
DeviceName = ''.'DISPLAY3
显然,我应该能够交叉引用DeviceName, DeviceID或PNPDeviceID与其他地方的列表来获取名称,不是吗?
请不要因为这个责备我,我已经谷歌了我能想到的一切,我所能找到的都是关于AllScreens和Win32_DesktopMonitor的信息,但没有找到我们在标准窗口显示设置对话框中看到的显示名称。
似乎有人在MSDN论坛上问了同样的问题。
有两个相关的答案,我将复制在这里:
我不确定你说的监视器名称是什么意思,唯一的监控的名字吗?当你调用EnumDisplayDevices枚举监视器可以指定以下标志:的DeviceID字段中的EDD_GET_DEVICE_INTERFACE_NAMEDISPLAY_DEVICE结构,您将看到唯一的监视器名称。
紧随其后:
谢谢,你的解决方案几乎100%到位了。我唯一需要的东西要添加的是对EnumDisplayDevices的第二次调用,并传入从第一次调用返回的DeviceName。则"设备名称"为上面只有监控员的名字,而不是显卡。完美!
我自己没有这样做,所以我无法验证它是否有效,但根据MSDN线程的OP说它对他有效,这似乎令人鼓舞。
为了完整起见,下面是类似MSDN答案的实际代码:
DISPLAY_DEVICE DisplayDevice = new DISPLAY_DEVICE();
const int EDD_GET_DEVICE_INTERFACE_NAME = 0x1;
int NumberOfMonitor = 0 /* You can either iterate over EnumDisplayDevices until
it returns false for the number of attached monitors,
or use 0 for the primary monitor.*/
EnumDisplayDevices(null, NumberOfMonitor, ref DisplayDevice, 0)) {
EnumDisplayDevices(DisplayDevice.DeviceName, NumberOfMonitor, ref DisplayDevice, EDD_GET_DEVICE_INTERFACE_NAME);
DisplayDevice
对象是一个名为DISPLAY_DEVICE的结构体:
[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)]
public struct DISPLAY_DEVICE
{
[MarshalAs(UnmanagedType.U4)]
public int cb;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst=32)]
public string DeviceName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst=128)]
public string DeviceString;
[MarshalAs(UnmanagedType.U4)]
public DisplayDeviceStateFlags StateFlags;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst=128)]
public string DeviceID;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst=128)]
public string DeviceKey;
}