2010-03-08 4 views
0

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

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

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

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

ответ

0

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

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

0

Вы пришли в register, чтобы получать информацию о силе?

+0

А, кажется, мне нужно сделать это для изменения настроек. Что делать, если меня интересует только PBT_APMSUSPEND? Документация, похоже, предполагает, что я должен получить WM_POWERBROADCAST, но я этого не делаю. Вы знаете? – psychotik

+0

Кроме того, эта функция кажется Vista + только ... – psychotik

0

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