【问题标题】:How can I uniquely identify a monitor?如何唯一识别显示器?
【发布时间】:2022-04-11 18:28:51
【问题描述】:

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

通常,如果您拔下显示器,Windows 似乎会跟踪显示器的配置设置。例如,我现在连接了三台显示器。如果我拔掉我的“主显示器”,Windows 将把剩下的两台显示器中的一台设为主显示器。然后,如果我重新连接显示器,Windows 通常会记住该显示器的配置,特别是在这种情况下,它是我的主显示器,并进行适当的设置。

我目前正在使用EnumDisplayDevicesEnumDisplaySettingsChangeDisplaySettingsEx 来设置每台显示器的配置(分辨率、方向等)。但是,查看EnumDisplayDevicesEnumDisplaySettings 填充DISPLAY_DEVICEDEVMODE 结构的信息,似乎没有什么能够唯一地标识监视器本身。对于当前配置(例如 \.\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 运行时。

标签: c# windows windows-7


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-11
    • 1970-01-01
    • 1970-01-01
    • 2015-07-11
    • 2013-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多