如何唯一地识别显示器?

7
我正在尝试编写一个程序,用于在显示器失去连接且Windows无法正确重新配置其先前设置的情况下重新配置显示器。通常,如果您拔掉一个显示器,Windows似乎会跟踪显示器的配置设置。例如,我现在连接了三个显示器。如果我拔掉我的“主显示器”,Windows将使剩余的两个显示器中的一个成为主显示器。然后,如果我重新连接显示器,Windows通常会记住该显示器的配置,具体来说,在这种情况下,它是我的主显示器,并相应地设置它。
我目前正在使用EnumDisplayDevices、EnumDisplaySettings和ChangeDisplaySettingsEx来设置每个显示器的配置(分辨率、方向等)。但是,查看EnumDisplayDevices和EnumDisplaySettings用DISPLAY_DEVICE和DEVMODE结构填充的信息时,似乎没有任何东西能够唯一地标识显示器本身。我将从当前配置中获取可唯一标识每个显示器之间的值(例如.\DISPLAY1和.\DISPLAY2.\DISPLAY3),但是如果我拔掉具有标识符.\DISPLAY1的显示器,则下次运行时我将获得值.\DISPLAY1和.\DISPLAY2。因此,该值无法用于以后唯一识别特定的显示器。
是否有关于每个连接的显示器的唯一信息可以用于标识它们?我认为这样的信息可能存在的原因是,大多数情况下,如果我拔掉显示器并重新插入它,Windows将保留其配置。

Windows确实为每个显示器存储了唯一的ID,但要找到这个ID非常复杂。打开设备管理器,展开“显示器”节点,右键单击并打开属性,然后转到“详细信息”选项卡。从下拉列表中选择设备实例路径。在HKLM\SYSTEM\CurrentControlSet\Control\DeviceClasses下,您将看到类似于\DISPLAY\SomeValue\SomeLongTextWithNumbersLetters&Ampersands的内容。(您也可能在ControlSet1下找到它。)这就是Windows识别显示器的方式,据我所知。 - Ken White
不幸的是,这似乎不能唯一地识别实际的硬件。当我插入三个显示器时,我会得到类似于以下的输出:`- DISPLAY\DELA0CA\4&7053205&0&UID53347072
  • DISPLAY\SAM0B94\4&7053205&0&UID51249920
  • DISPLAY\DELA0CA\4&7053205&0&UID55444224`。
如果我拔掉其中一个显示器,我会得到`- DISPLAY\DELA0CA\4&7053205&0&UID53347072
  • DISPLAY\SAM0B94\4&7053205&0&UID51249920`。
如果我重新插入该显示器,拔掉另一个显示器,然后重新启动计算机,我仍然会得到`- DISPLAY\DELA0CA\4&7053205&0&UID53347072
  • DISPLAY\SAM0B94\4&7053205&0&UID51249920`。
- Imbajoe
我在Dell 690上运行W7 64位时,使用4个24英寸显示器遇到了问题。它只能启动2个显示器,直到我开始进行“长时间”启动,BIOS检查所有硬件,不知道您是否添加了内存或更改了CPU等。 BIOS构建一个.dmi表(设备主索引),Windows在启动时使用它。现在它可以正确地运行所有4个显示器。我不知道在Windows运行时更改此配置的方法。 - user5952891
1个回答

0

wmimonitorid类访问的硬件特定数据比EnumDisplaySettings更多,特别是SerialNumberID,它应该是唯一的(至少)来自特定制造商的整个监视器范围内。
该字段是一个Uint16数组,因此可以使用类似于this answer中提供的代码进行读取。

对于PnP监视器,还可以尝试在Win32-PNPEntity类中使用DeviceID。可以基于伪代码在WMI查询中检索:

SELECT * FROM Win32_PnPEntity WHERE ClassGuid={4d36e96e-e325-11ce-bfc1-08002be10318}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接