【发布时间】:2022-04-11 18:28:51
【问题描述】:
我正在尝试编写一个程序,用于在显示器断开连接且 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 标识监视器 AFAICT 的方式。 -
不幸的是,这似乎并不能唯一地识别实际的硬件。当我插入三个时,我会得到这样的信息:
- 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 -
我在运行 W7 64 位的戴尔 690 上运行 4 个 24" 显示器时遇到问题。它只会启动运行 2 个显示器,直到我开始进行“长时间”启动,其中 BIOS 检查所有硬件,不知道您是否添加了内存或更改了 cpu 等。Bios 构建了一个 .dmi 表(设备主索引),Windows 在启动时使用它。它现在可以正确运行所有 4 个显示器。我不知道如何更改此配置在 Windows 运行时。