I want to hook the WM_MOUSEDOWN and WM_MOUSEUP events from a specific button inside a specific window. I am thinking that SetWindowsHookEx will hook the messages I want. and Fin
You can't make SetWindowsHookEx only give you thew events from a single window handle, but you can filter it yourself. If you are using the WH_CALLWNDPROC
or WH_CALLWNDPROCRET
(which you need to use to get the mouse messages you are interested in), the lParam
value of CallWndProc and CallWndRetProc are a structure that contain the window handle of the control processing the message.
So in your SetWindowsHookEx
call back you only need to check that the message is for the window you are filtering.
For example:
static HWND s_hWndButton;
.....
SetWindowsHookEx(WH_CALLWNDPROC, ButtonHookProc, ....);
.....
LRESULT CALLBACK CallWndProc(int nCode, WPARAM wParam, LPARAM lParam) {
if (nCode >= 0) {
CWPSTRUCT* cp = (CWPSTRUCT*)lParam;
if (cp->hWnd == s_hWndButton) {
if (cp->Msg == WM_MOUSEUP || cp->Msg == WM_MOUSEDOWN) {
// Your logic goes here
}
}
}
Return CallNextHookEx(NULL, nCode, wParam, lParam);
}
Pretty much the same logic would apply for WH_CALLWNDPROCRET