Надежный способ идентификации устройств отображения?
Я работал над решением для идентификации устройств отображения (telivisions в моем случае), чтобы сохранить основной макет, который специально разработан для использования нескольких мониторов.
Допустим, у меня есть 6 подключенных телевизоров. (обычно 3 из них через порты HDMI и 3 других через порт DVI (с использованием адаптера DVI-to-HDMI)), а их физическое расположение 3x2, например:
ТВ1 ... ТВ2 ... ТВ3
TV4... TV5... TV6
Цель
Я хочу отображать полноэкранный контент на каждом конкретном телевизоре. Content1 должен идти на TV1, Content2 должен идти на TV2 и т. Д. Другими словами: мне нужно перенести мой контент на DisplayDevice (телевидение), а не в какое-либо местоположение или экран, потому что они могут измениться из-за поведения Windows. (увидеть ниже)
Как вы, возможно, знаете, Windows не перечисляет устройства отображения в том порядке, в котором вы их подключаете (или фактически вообще не основывается на каком-либо правиле?). Он использует совершенно другой способ перечисления отображений, например:
\. \ DISPLAY3... \. \ DISPLAY6... \. \ DISPLAY1
\. \ DISPLAY4... \. \ DISPLAY2 ... \. \ DISPLAY5
Чтобы избавиться от этого, я заказываю телевизоры в настройках дисплея вручную, когда я закончу подключать все из них в соответствии с их реальным местоположением.
Проблема
Но здесь есть проблема: некоторые модели телевизоров просто делают вид, что их отключили, когда они выключены (или переведены в режим ожидания), и это заставляет Windows отключить устройство отображения из системы и повторно перечислить Устройства отображения снова и снова.
Из-за этого поведения (как для некоторых моделей телевизоров, так и для самой Windows) я не могу рассчитывать на свойство Screen.DisplayName или даже на Screen.Location, поскольку они являются переменными. Они оба меняются сразу после процесса повторного перечисления.
Решения, которые я пробовал до сих пор
Я пытался получить серийные номера всех устройств отображения, думая, что смог бы найти способ соотнести эти числа с Screen.DisplayName. Ну, на самом деле, я справился с этим с помощью SetupAPI, EnumDisplayDevices, но все это оказалось бесполезным после того, как я понял, что у большинства телевизоров нет действительного SerialNumber. Даже у телевизора Samsung нет серийного номера (но у монитора Samsung, безусловно, есть - так что я думаю, что это разница между "монитором" и "телевидением")
В конце концов..
Я все еще ищу способ преодолеть эту проблему. Другая мысль, которая приходит мне в голову, может быть, мне следует прекратить пытаться отправить контент на устройство отображения (потому что они не могут быть идентифицированы) Может быть, я должен попытаться отправить контент на порты графической карты, что означает, что я должен определить, какие порты графических карт соотносится с тем, какое устройство отображения (экран), но я все говорю без каких-либо знаний об этом - даже не зная, возможно ли такое или нет.
Я ищу ваши советы, спасибо.
1 ответ
Когда вы используете DVI, для вашей проблемы может быть аппаратное решение: EDID Managers. Эти устройства эмулируют действительный EDID, даже если монитор позади него выключен.