获取与在显示设置中找到的显示名称匹配的显示名称

本文关键字:显示 设置 获取 | 更新日期: 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;
}