我一直在研究一种用于识别显示设备(在我的例子中是电视)的解决方案,以保持专为使用多显示器而设计的主要布局。
假设我连接了 6 台电视。(通常其中 3 个通过 HDMI 端口,另外 3 个通过 DVI 端口(使用 DVI-to-HDMI 适配器)),它们的物理位置是 3x2,如下所示:
电视 1 ... 电视 2 ... 电视 3
电视4 ... 电视5 ... 电视6
目标
我想在每台特定的电视上显示一些全屏内容。Content1 必须转到 TV1,Content2 必须转到 TV2 等等......换句话说:我需要将我的内容推送到 DisplayDevice(电视) - 而不是任何位置或屏幕,因为它们可能会因 Windows 行为而改变。(见下文)
您可能知道,Windows 不会按照您连接它们的顺序枚举显示设备(或者实际上根本不基于任何规则?)。它使用完全不同的方式来枚举显示,例如:
\.\DISPLAY3 ... \.\DISPLAY6 ... \.\DISPLAY1
\.\DISPLAY4 ... \.\DISPLAY2 ... \.\DISPLAY5
为了克服这个问题,当我完成所有电视的连接以匹配它们的真实位置时,我会在显示设置中手动订购电视。
问题
但是这里有一个问题:一些电视型号只是在关机(或设置为待机模式)时假装它们已被拔掉,这会导致 Windows将显示设备从系统中删除并重新枚举重新显示设备。
由于这种行为(一些电视型号和 Windows 本身),我不能指望Screen.DisplayName属性甚至Screen.Location因为它们是变量。它们都在重新枚举过程后立即更改。
到目前为止我尝试过的解决方案
我试图获取所有显示设备的序列号,认为我可以找到一种方法将这些数字与 Screen.DisplayName 相关联。好吧,我实际上是通过使用 SetupAPI、EnumDisplayDevices 来管理到达那里的,但是在我意识到大多数电视没有有效的序列号之后,这一切都变成了垃圾。甚至三星电视也没有序列号(但三星显示器肯定有 - 所以我想这是关于“显示器”和“电视”之间的区别)
毕竟..
我仍在寻找解决这个问题的方法。我想到的另一个想法是,也许我应该停止尝试将内容推送到显示设备(因为它们无法识别)也许我应该尝试将内容推送到显卡的端口,这意味着我必须确定哪些端口显卡的数量与哪个显示设备(屏幕)相关,但我都在谈论它,但对此一无所知 - 甚至不知道这样的事情是否可能。
我正在寻找您的建议,现在谢谢。