В Java можно ли прослушивать подключение / отключение внешнего монитора?
После отсоединения внешнего монитора от моего ноутбука я теряю некоторые приложения, так как отключенный монитор по-прежнему установлен по умолчанию. Некоторые из моих окон пытаются отобразить на отключенном мониторе.
У меня есть обходной путь, такой как щелчок правой кнопкой мыши на значке приложения и выбор перемещения, а затем использование клавиши со стрелкой для перемещения окон на моем ноутбуке. Мне интересно, есть ли способ в Java, чтобы прослушать разрыв соединения, а затем сбросить экран по умолчанию на моем ноутбуке.
Я думал о том, чтобы узнать количество и идентификаторы экранов, доступных при запуске, и добавить их в файл свойств. Если экран отключен, снова получите количество и идентификаторы доступных экранов и сравните эти значения со значениями в моем файле свойств. Затем я могу установить экран по умолчанию, который соответствует новым значениям и сохраненным значениям.
Я еще не начал кодировать это. Это более следственный, чем что-либо на данный момент.
2 ответа
AWT предоставляет вам доступ к экранной информации, хотя "внешний" является субъективным, поскольку у вас может быть 2 встроенных монитора или 2 внешних.
На базовом уровне вы можете посчитать мониторы в любой момент:
int numberOfMonitors = 0;
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice[] gs = ge.getScreenDevices();
for (int j = 0; j < gs.length; j++) {
GraphicsDevice gd = gs[j];
GraphicsConfiguration[] gc = gd.getConfigurations();
if (gc.getType() == TYPE_RASTER_SCREEN) numberOfMonitors++;
}
System.out.println("Number of monitors: " + numberOfMonitors);
Чтобы обнаружить вложение нового монитора, вам нужно будет опросить результат.
Это чисто Java-решение; Насколько мне известно, если вы хотите что-то более точное, чем это, вам, вероятно, потребуется вызвать некоторые нативные инструменты на платформе (ах), на которую вы ориентируетесь. Например, исследование sysfs в Linux.
По сути, я бы сказал, что это довольно сложно или невозможно сделать Java
только. Причина в том, что Java является кроссплатформенным языком, и все это обрабатывается базовой операционной системой. Пожалуйста, имейте в виду, что трудно найти надежное, кроссплатформенное решение для этой проблемы.
Вы спрашиваете, как определить, подключен или отключен монитор:
Под Windows вы можете подключить WM_DEVICECHANGE через собственный доступ Java.
Может быть, идея, чтобы проверить время от времени getScreenDevices()
и обнаруживать изменения, но это скорее обходной путь, чем реальное решение.
Вы также спрашиваете, как вы можете изменить основной дисплей. Существует пример того, как вы можете использовать WinAPI для этой задачи.
Для другой операционной системы вам нужно найти другие способы. Я надеюсь, что этот ответ дает представление, что это может быть довольно трудно решить, особенно с Java.
Если вы ориентируетесь на Windows со своим Java-приложением, есть аппаратный обходной путь.
Подключение монитора с помощью кабеля DisplayPort позволяет Windows узнать, когда дисплей выключен (будь то кнопка питания или отключенный кабель). Когда Windows обнаруживает, что монитор переходит в автономный режим, она перемещает все окна отключенного монитора на экран, который остается включенным. Никакого дополнительного кодирования не требуется. Хотя это и ограниченный вариант использования, это может избавить вас от некоторых проблем, если вы контролируете оборудование.
С другой стороны, если вы кодируете свое собственное решение, вам следует протестировать свое решение на такой настройке, чтобы убедиться, что результат перемещения окон Windows и перемещения окон вашего программного обеспечения не приводит к нежелательному поведению.
(Это мой опыт работы с коробкой Windows 10 с графическими процессорами / мониторами NVIDIA/HP, YMMV)