C# 如何唯一标识监视器?

C# 如何唯一标识监视器?,c#,windows,windows-7,C#,Windows,Windows 7,我正在尝试编写一个程序,用于在显示器失去连接、Windows无法正确重新配置其先前设置的情况下重新配置显示器 通常,如果您拔下显示器的插头,Windows似乎会跟踪显示器的配置设置。例如,我现在已经连接了三个监视器。如果我拔下“主显示器”,Windows将使剩下的两个显示器中的一个成为主显示器。然后,如果我重新连接显示器,Windows通常会记住该显示器的配置,特别是在本例中,它是我的主显示器,并进行适当的设置 我目前正在使用EnumDisplayDevices、EnumDisplaySetti

我正在尝试编写一个程序,用于在显示器失去连接、Windows无法正确重新配置其先前设置的情况下重新配置显示器

通常,如果您拔下显示器的插头,Windows似乎会跟踪显示器的配置设置。例如,我现在已经连接了三个监视器。如果我拔下“主显示器”,Windows将使剩下的两个显示器中的一个成为主显示器。然后,如果我重新连接显示器,Windows通常会记住该显示器的配置,特别是在本例中,它是我的主显示器,并进行适当的设置

我目前正在使用
EnumDisplayDevices
EnumDisplaySettings
ChangeDisplaySettingsEx
为每个监视器设置配置(分辨率、方向等)。但是,查看使用什么信息
EnumDisplayDevices
EnumDisplaySettings
填充
DISPLAY\u设备
DEVMODE
结构,似乎没有什么东西能够唯一地标识监视器本身。我将获得唯一标识当前配置中每个显示器的值(\.\DISPLAY1和\.\DISPLAY2\.\DISPLAY3,例如),但如果我拔下标识符为\.\DISPLAY1的监视器,下次运行时,我将获得值\.\DISPLAY1和\.\DISPLAY2。因此,该值不能用于以后不正确地标识特定监控器


是否有一些关于连接的每个监视器的独特信息,我可以用来识别它们?我认为可能存在这样一条信息,这是因为在大多数情况下,如果我拔下显示器并将其重新插入,Windows将保留其配置。

Windows确实为每个显示器存储了一个唯一的ID,但要找到ID非常复杂。转到设备管理器,展开“显示器”节点,右键单击并打开“属性”,然后转到“详细信息”选项卡。从下拉列表中选择设备实例路径。您将在HKLM\SYSTEM\CurrentControlSet\Control\DeviceClass下看到类似于
\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
我在运行4 24时遇到问题“运行W7 64位的Dell 690上的监视器。它将只运行2个监视器启动,直到我开始执行“长”启动,BIOS检查所有硬件,不知道是否添加了ram或更改了cpu等。BIOS构建了一个.dmi表(设备主索引),Windows在启动时使用它。它现在可以正确运行所有4个监视器。我知道在Windows运行时无法更改此配置。