簡體   English   中英

獲取與顯示設置中找到的顯示名稱匹配的顯示名稱

[英]Get display name that matches that found in display settings

在編寫WPF應用程序時,我想獲取在標准Windows顯示設置對話框中找到的顯示名稱。 我試過WMI查詢Win32_DesktopMonitor和System.Windows.Forms.Screen.AllScreens。

在標准Windows顯示設置列表中顯示的名稱是:

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顯示設置對話框中看到的顯示名稱。

非常感謝你。

似乎有人在MSDN論壇上問了這個完全相同的問題。

我將在這里重復兩個相關的答案:

我不確定監視器名稱(唯一的監視器名稱)是什么意思? 如果在調用EnumDisplayDevices枚舉監視器時可以指定以下標志:EDD_GET_DEVICE_INTERFACE_NAME,則在DISPLAY_DEVICE結構的DeviceID字段中,您將看到唯一的監視器名稱。

其次是:

謝謝,您的解決方案幾乎達到了100%。 我唯一需要添加的是對EnumDisplayDevices的第二次調用,並傳入從第一次調用返回的DeviceName。 然后,用監視器的名稱而不是視頻卡填充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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM