![]() |
Отловить вращение колеса прокрутки
Требуется отлавливать вращение колесика мыши не только в окне программы, но и вообще во всей системе. По логике веще нужно ставить хук с помощью функции SetWindowsHookEx на WH_MOUSE и отлавливать в этой функции событие WM_MOUSEWHEEL (522), что я и делаю. НО при таком раскладе невозиожно определить в какую сторону вращается колесо, т.к. в эту функцию не возвращается параметр zDelta. Или я не прав и он там всё-таки как-то доступен?? Если нет, то как ещё можно отловить вращение колеса в системе?
ПРИМ: дело происходит на сях. |
Из MSDN к WM_MOUSEWHEEL :
Код:
.... |
PHP код:
|
Читаем дальше MSDN :
Код:
Windows 95, Windows NT 3.51: Support for the mouse wheel is |
можно например глобал хук поставить :) тогда везде работать будет :)))
|
Цитата:
|
Глобальный хук все равно придеться ставить. По другому не сделаешь.
|
совершенно точно :) по другому никак =\
да и не сильно там потеряется....если правильно сделать :) |
Похоже я вас не так понял. Под "глобальным хуком" я подразумевал хук типа WH_CALLWNDPROC, который перехватывает всё виды сообщений сисетмы :dont: , что еснно вызывает тормоза.
А вообще я тик использую "глобалный хук" в вашем понимании. |
WH_MOUSE?
не? |
donatas
WH_MOUSE_LL |
хуки, хуки... :) главное хвост!
ловим WM_MOUSEWHEEL if(HIWORD(wParam)>32512) - колесо крутится в одну сторону else - в другую... |
Цитата:
Приведите плиз кусок кода который реально у вас отлавливает прокрутку. |
хм... ну можно и реальный кусок:
procedure WMMouseWheel(var Msg: TMessage); message WM_MOUSEWHEEL; .... procedure TFormTTF.WMMouseWheel(var Msg: TMessage); begin if(HIWORD(msg.WParam)>32512)then begin if StringGrid1.Row<(StringGrid1.RowCount-1) then StringGrid1.Row:=StringGrid1.Row+1;end else if StringGrid1.Row>1 then StringGrid1.Row:=StringGrid1.Row-1; inherited; end; Как можно заметить - это Дельфи (3, если это имеет какое-то значение). Сей кусок позволяет перемещаться по StringGrid-у с помощью колеса прокрутки. На С должно выглядеть примерно так: LRESULT CALLBACK MainWndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam) { switch(msg){ case WM_MOUSEWHEEL: if(HIWORD(wParam)>32512){}/*что-то важное делаем здесь*/ else {}/*не менее важное делаем здесь*/ break; default: return DefWindowProc(hwnd,msg,wParam,lParam); } return DefWindowProc(hwnd,msg,wParam,lParam); } Правда С-шный код я не проверял (у меня на работе мышь без колесика) А вот еще кусочек из примеров lcc: LRESULT CALLBACK MsgHookProc(int nCode, WPARAM wParam, LPARAM lParam) { LPMSG lpMsg; unsigned int i; lpMsg = (LPMSG)lParam; if (lpMsg->message == WM_MOUSEWHEEL) { if ((short) HIWORD(lpMsg->wParam) > 0) { for (i = 0; i < g_nLNumber; i++) { SendMessage(lpMsg->hwnd, WM_VSCROLL, MAKEWPARAM(SB_LINEUP, 0), (LPARAM)NULL); } } else { for (i = 0; i < g_nLNumber; i++) { SendMessage(lpMsg->hwnd, WM_VSCROLL, MAKEWPARAM(SB_LINEDOWN, 0), (LPARAM)NULL); } } } return CallNextHookEx(g_hMsgHook, nCode, wParam, lParam) ; } В данном случае вешается хук для того что-бы добавить возможность управления колесиком в !!!чужой!!! программе. Это вкратце... :) |
Flex256
Рассмотрим последнюю функцию. Для удобства немного сократим её: Код:
LRESULT CALLBACK MsgHookProc(int nCode, WPARAM wParam, LPARAM lParam){Код:
if (lpMsg->message == WM_MOUSEWHEEL)Код:
if (wParam == WM_MOUSEWHEEL) |
стоп, стоп, стоп
мышиное колесо обрабатывается в !!!своей!!! программе, потому использование хуков в данном случае - мягко говоря плохой тон! Но тем не менее хук ставится примерно так: g_Hook=SetWindowsHookEx(WH_GETMESSAGE, (HOOKPROC)MsgHookProc, g_hInst, dwThreadID); Но вернемся к нашим баранам: LRESULT CALLBACK MainWndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam) { switch(msg){ case WM_MOUSEWHEEL: if(HIWORD(wParam)>32512) MessageBox(hwnd, "if", "", MB_OK); else MessageBox(hwnd, "else", "", MB_OK); break; default: return DefWindowProc(hwnd,msg,wParam,lParam); } return DefWindowProc(hwnd,msg,wParam,lParam); } попробуй лучше такой вариант. Я думаю он правилен. К сожалению сам проверить этот кусочек не могу - нет колесика на мыши. Могу проверить только вечером дома. А дельфийский вариант 100% работает. |
а мне как раз и нужно, чтобы колесо отлавливалось ВЕЗДЕ, во всей системе вообще, а не толко в моей программе!
>g_Hook=SetWindowsHookEx(WH_GETMESSAGE, (HOOKPROC)MsgHookProc, g_hInst, dwThreadID); WH_GETMESSAGE.. хмм.. а не кажется ли тебе что это слишком ставить хук такого типа? Он вебь будет жрать больше ресурсов чем WH_MOUSE. |
я думаю, что можно поставить и на WH_MOUSE
только посмотри, что передается в HIWORD(wParam) и в ссответствии с этим поставь if Скорее всего за направление отвечает всего один бит |
зы предположительно старший :)
(судя по ифам) |
| Часовой пояс GMT +4, время: 15:43. |
Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.