我一直在为识别显示设备(我的情况是电视)的解决方案而努力,以保持主要布局,该布局专门设计用于使用多个监视器。
假设我连接了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达到了这一点,但在我意识到大多数电视机没有有效的序列号后,这一切都变成了垃圾。即使三星电视也没有序列号(但三星监视器当然有 - 所以我想这是“监视器”和“电视”的区别)
总之...
我仍在寻找解决此问题的方法。另一个想法是,也许我应该停止试图推送内容到显示设备(因为它们无法识别),而应该尝试将内容推送到显卡的端口上,这意味着我必须确定哪些显卡端口与哪个显示设备(屏幕)相关联,但我对此一无所知,甚至不知道是否可能。
期待您的建议,先谢谢。
假设我连接了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达到了这一点,但在我意识到大多数电视机没有有效的序列号后,这一切都变成了垃圾。即使三星电视也没有序列号(但三星监视器当然有 - 所以我想这是“监视器”和“电视”的区别)
总之...
我仍在寻找解决此问题的方法。另一个想法是,也许我应该停止试图推送内容到显示设备(因为它们无法识别),而应该尝试将内容推送到显卡的端口上,这意味着我必须确定哪些显卡端口与哪个显示设备(屏幕)相关联,但我对此一无所知,甚至不知道是否可能。
期待您的建议,先谢谢。