Не получает 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? Вам могут потребоваться повышенные права (права администратора).

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