Надежный способ идентификации устройств отображения?

Я работал над решением для идентификации устройств отображения (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, даже если монитор позади него выключен.

Другие вопросы по тегам