Is there a way to hook mouse events for a specific button in a windows form

后端 未结 2 578
北荒
北荒 2021-01-21 05:18

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

2条回答
  •  醉话见心
    2021-01-21 06:07

    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

提交回复
热议问题