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 andCallWndRetProc 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