Почему WM_MOUSEWHEEL срабатывает в хуке WH_GETMESSAGE, а не в хуке WH_MOUSE? - PullRequest
2 голосов
/ 29 апреля 2020

Я установил две ловушки локального потока (в контексте объекта-помощника браузера Explorer), например:

SetWindowsHookEx(   WH_MOUSE,
                    MouseHookProc,
                    NULL,
                    GetCurrentThreadId()  );

SetWindowsHookEx(   WH_GETMESSAGE,
                    GetMsgProc,
                    NULL,
                    GetCurrentThreadId()  );

Мои процедуры подключения выглядят так:

LRESULT CALLBACK MouseHookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    if (nCode < 0)
    {
        return CallNextHookEx(NULL, nCode, wParam, lParam);
    }

    switch (wParam)
    {

    case WM_MOUSEWHEEL:
        ATLTRACE("\n WM_MOUSEWHEEL from MouseHookProc \n"); // <-- Does not print on mouse wheel movement
        break;
    }

    return CallNextHookEx(NULL, nCode, wParam, lParam);
}

LRESULT CALLBACK GetMsgProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    if (nCode < 0)
    {
        return CallNextHookEx(NULL, nCode, wParam, lParam);
    }

    LPMSG lpmsg = (LPMSG)lParam;
    UINT msg = LOWORD(lpmsg->message);

    switch (msg)
    {

    case WM_MOUSEWHEEL:
        ATLTRACE("\n WM_MOUSEWHEEL from GetMsgProc \n");  // <-- Prints on mouse wheel movement
        break;
    }

    return CallNextHookEx(NULL, nCode, wParam, lParam);
}

Похоже, что только WH_GETMESSAGE ловушка получает сообщение WM_MOUSEWHEEL. Я что-то не так делаю или так должно быть? И если это должно произойти, почему? Спасибо за любую информацию.

В качестве примечания, при изучении этого я обнаружил ошибку в Windows (по крайней мере на 8.1, с использованием трекпада Synaptics). Если вы выберете файл в Проводнике, затем щелкните по имени, чтобы запустить таймер переименования, а затем начните прокрутку до появления элемента управления переименованием, элемент управления переименованием все равно появится и просто всплывет после прокрутки: Прокрутка проводника / переименовать ошибку gif

...