Обнаружение подключения или удаления внешнего дисплея в 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, чтобы получить идентификатор для этих сообщений.

Есть также другие сообщения, которые вы можете проверить, просто посмотрите связанный ответ.

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