Обнаружение подключения или удаления внешнего дисплея в Windows 7
Есть ли какое-либо событие или уведомление, которое я могу получать или подключать каждый раз, когда внешний ЖК-монитор подключен или отключен от ноутбука под управлением Windows 7?
Ноутбук обнаруживает это и переключает мой дисплей на внешний экран и обратно с определенными типами изменения размера или изменения положения, но отображается ли это операционной системой, чтобы приложения могли предоставлять обработчик, прикреплять сценарий и т. Д.?
Если нет, есть ли параметр реестра или API, которые я мог бы опрашивать время от времени?
(Я предпочитаю программировать на C + Win32 API)
ОБНОВИТЬ
Ответ Майка ниже, WM_DEVICECHANGE
привел меня к RegisterDeviceNotification()
, но я изо всех сил пытаюсь реализовать это до сих пор...
ОБНОВЛЕНИЕ 2
Этот вопрос пару раз задавался с другой формулировкой, но, на мой взгляд, еще не полностью ответил:
3 ответа
Согласно этой статье Windows отправляет WM_DISPLAYCHANGE
сообщение при изменении разрешения дисплея, а также при добавлении или удалении дисплея.
Если вам нужно реагировать на изменения размера рабочего стола из-за добавления или удаления монитора, вы можете сделать это в обработчике этого сообщения. LPARAM
дает вам новое разрешение дисплея, на котором расположено окно. Обратите внимание, что это разрешение будет масштабироваться, если вы используете что-либо кроме 100% для масштабирования системного DPI, и ваша программа не поддерживает DPI.
В качестве альтернативы используйте EnumDisplayMonitors
функция, чтобы получить разрешение дисплея для каждого подключенного монитора и относительное положение мониторов на виртуальном рабочем столе. Эта функция использует значения пикселей реального устройства независимо от масштабирования DPI.
Вы можете попробовать WM_DEVICECHANGE. Если это не сработает, запустите ваше окно и присоедините к нему Spy++, который будет регистрировать все сообщения окна, которые он получает. Затем подключите монитор и проверьте, получили ли вы какие-либо сообщения.
В качестве альтернативы вы можете опрашивать GetSystemMetrics() с помощью SM_CMONITORS.
Как сказано здесь:
Вы увидите зарегистрированные сообщения "UxdDisplayChangeMessage" и "HotplugDetected" (второе только при добавлении монитора). Вы можете использовать RegisterWindowMessage, чтобы получить идентификатор для этих сообщений.
Есть также другие сообщения, которые вы можете проверить, просто посмотрите связанный ответ.