识别显示设备的可靠方法?

Ron*_*ovi 7 .net c# windows multiple-monitors edid

我一直在研究识别显示设备(在我的情况下是telivisions)的解决方案,以保持主要布局,特别设计为使用多显示器.

假设我连接了6台电视机.(通常其中3个通过HDMI端口,其他3个通过DVI端口(使用DVI到HDMI适配器)),它们的物理位置是3x2,如下所示:

TV1 ... TV2 ... TV3

TV4 ... TV5 ... TV6

目标

我想在每个特定的电视上显示一些全屏内容.Content1必须转到TV1,Content2必须转到TV2等...换句话说:我需要将我的内容推送到DisplayDevice(电视) - 而不是任何位置或屏幕,因为它们可能因Windows行为而改变.(见下文)

您可能知道,Windows不会按照您连接它们的顺序枚举显示设备(或者实际上根本不基于任何规则?).它使用完全不同的方式枚举显示,例如:

\.\ DISPLAY3 ... \.\ DISPLAY6 ... \.\ DISPLAY1

\.\ DISPLAY4 ... \.\ DISPLAY2 ... \.\ DISPLAY5

我做了什么来解决这个问题,当我完成连接所有电视以匹配他们的真实位置时,我手动在显示设置中订购电视.

问题

但有SA问题就在这里:一些电视模型只是假装喜欢他们已经被拔掉时,他们关闭(或设置为待机模式),并且会导致Windows 下降显示设备从系统和重新枚举的再次显示设备.

由于这种行为(某些电视模型和Windows本身),我不能指望Screen.DisplayName属性甚至Screen.Location,因为它们是变量.它们都在重新枚举过程后立即改变.

到目前为止我尝试过的解决方案

我试图获取所有显示设备的序列号,认为我可以找到一种方法将这些数字与Screen.DisplayName相关联.好吧,我实际上通过使用SetupAPI的EnumDisplayDevices来管理那里,但是在我意识到大多数电视没有有效的SerialNumber后,这一切都变成了垃圾.即便是三星电视也没有Seri​​alNumber(但三星显示器肯定没有 - 所以我猜这是关于"显示器"和"电视"之间的区别)

毕竟..

我仍在寻找解决这个问题的方法.我想到的另一个想法是,也许我应该停止尝试将内容推送到显示设备(因为它们无法识别)也许我应该尝试将内容推送到显卡的端口,这意味着我必须确定哪些端口图形卡的关联与哪个显示设备(屏幕)有关,但我都在谈论它而不知道它 - 甚至不知道这样的事情是否可能.

我正在寻找你的建议,谢谢你们.

Hei*_*ner 1

当您使用 DVI 时,可能有一个硬件解决方案可以解决您的问题:EDID 管理器。即使背后的显示器关闭,这些设备也会模拟有效的 EDID。