Я установил две ловушки локального потока (в контексте объекта-помощника браузера 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