Не получает WM_WTSSESSION_CHANGE в Windows 7 64bit
Я писал DLL и пытался получить уведомление о блокировке экрана пользователем. Я обнаружил, что WM_WTSSESSION_CHANGE подойдет для моих нужд, но я не могу прочитать это сообщение в своей библиотеке, более того, когда я увидел приложение с помощью spyxx.exe, я мог видеть, что WM_WTSSESSION_CHANGE
сообщение опубликовано
Может ли кто-нибудь взглянуть и сказать, что я делаю не так?
Некоторые основные списки:
настройка обратного вызова WndProc:
HHOOK hook = SetWindowsHookEx(
WH_CALLWNDPROC,
(HOOKPROC) __monitor,
hInstance,
GetCurrentThreadId());
реестр для уведомления о событиях:
WTSRegisterSessionNotification(hwnd, NOTIFY_FOR_THIS_SESSION);
функция обратного вызова:
LRESULT CALLBACK __monitor(
int code,
WPARAM wParam,
LPARAM lParam)
{
CWPSTRUCT *msg= (CWPSTRUCT *) lParam;
// have verified that the statement : hwnd == msg->hwnd is true
switch (msg->message)
{
// ...
case WM_DESTROY:
//... this case is handled OK
break;
case WM_WTSSESSION_CHANGE:
//... FAIL, never enters here
break;
}
// CallNextHookEx ..
}
2 ответа
Похоже, вы столкнулись с двумя проблемами. Во-первых, это идентификатор потока, который вы передаете SetWindowsHookEx
должен быть тем же идентификатором потока, в котором работает ваше главное окно верхнего уровня. Исправление этой проблемы будет означать, что функция ловушки будет вызываться в том же потоке, что и окно. Если вам нужно обработать его в другом потоке, вам нужно будет подключить функцию ловушки к другому потоку.
Во-вторых, что WH_CALLWNDPROC
функции хуков не доставляются WM_WTSSESSION_CHANGE
сообщения, вероятно, потому что это отправлено, а не отправлено. Используя WH_GETMESSAGE
крюк работает однако.
Вам не нужен Windows-хук в качестве обратного вызова, любая оконная процедура с циклом сообщений сделает свое дело. Используйте нормальный подход.
Вы проверили возвращаемое значение WTSRegisterSessionNotification
? Вам могут потребоваться повышенные права (права администратора).