在编写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显示设置对话框中看到的显示名称。
非常感谢。
答案 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;
}