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

时间:2011-09-20 14:05:31

标签: c# wpf

在编写WPF应用程序时,我想获取标准Windows显示设置对话框中显示的显示名称。我已经尝试过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的信息,但没有找到我们在标准Windows显示设置对话框中看到的显示名称。

非常感谢。

2 个答案:

答案 0 :(得分:1)

看起来有人在MSDN Forums上问了这个完全相同的问题。

我将在此重复两个相关答案:

  

我不确定您的显示器名称是什么意思,唯一的   监视器名称?如果你打电话给EnumDisplayDevices来枚举   监视器您可以指定以下标志:   EDD_GET_DEVICE_INTERFACE_NAME然后在的DeviceID字段中   DISPLAY_DEVICE结构您将看到唯一的监视器名称。

接下来是:

  

谢谢,你的解决方案差不多100%。我唯一需要的东西   添加是对EnumDisplayDevices的第二次调用并传入。{   第一次调用返回的DeviceName。然后是DeviceName   填充了监视器的名称而不是视频卡。完美!

我自己没有这样做,所以我无法验证它是否有效,但基于MSDN线程的OP说这对他有用,这似乎令人鼓舞。

答案 1 :(得分:0)

为了完成,这里是类似于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;
}