Обработчик WM_POWERBROADCAST для CMainDlg в приложении ATL не вызывается

У меня есть приложение ATL, где я хочу обрабатывать WM_POWERBROADCAST. У меня есть CMainDlg (CAxDialogImpl), в которой MSG_MAP я определил обработчик.

BEGIN_MSG_MAP(CMainDlg)
    ...
    MESSAGE_HANDLER(WM_POWERBROADCAST, OnPowerChange)
    ...
END_MSG_MAP()

Однако, обработчик не вызывается, когда я делаю вещи, которые должны вызывать его, например, изменять настройки электропитания или переводить компьютер в спящий режим.

Любые идеи о том, что может происходить, и как это исправить? По какой-то причине CMainDlg не получает уведомления о событиях питания?

3 ответа

Решение

Я подозреваю, что ваш диалог не является окном верхнего уровня (в стиле WS_POPUP).

Только что протестировано с немодальным диалоговым приложением WTL AppWizard, что WM_POWERBROADCAST получен (без какой-либо регистрации) на подключенном / отключенном AC.

Вы зарегистрировались, чтобы получать события силы?

Чтобы добавить к ответам выше, вы можете использовать инструмент Spy++, чтобы убедиться, что интересующие сообщения будут публиковаться в вашем приложении в первую очередь. Вы также увидите, в какие окна они отправлены, и если это ваше окно, где вы ждете этого сообщения.

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