0

I am trying to create a mouse hook using the Windows API. Currently, I have the following code, but I am struggling to make it work. Perhaps some sample code would help me to understand the concepts better.

LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    HWND hWindow , hEntryWnd;
    HRESULT hResult;
    ztcEvents pEvent;
    ztcField *p_click_field;
    ztcInterfaceContext *p_context_interface;
    TCHAR      className [32];
    HWND hWnd;
    if (nCode < 0) // do not process message 
        return CallNextHookEx(hook, nCode, wParam, lParam); 
    MOUSEHOOKSTRUCT *msg = (MOUSEHOOKSTRUCT *)lParam;

    switch (nCode) 
    { 
    case HC_ACTION: 
        {
            hWnd                =  msg->hwnd;
            p_click_field       = pEvent.GetMatchField(hWnd);
            p_context_interface = pEvent.getMarkInterface();
            if(p_click_field == NULL || p_context_interface == NULL)
            {
                break;
            }
            GetClassName(p_click_field->Widget ()->WindowHandle() , className , sizeof (className ) - 1 );

            if(p_click_field->Widget()->IsKindOf(RUNTIME_CLASS(ztcOleWdgt)))
            {
                switch(wParam)
                {
                    case WM_LBUTTONDOWN:

                        hWindow = p_click_field->Widget()->Parent()->WindowHandle();
                        hEntryWnd = p_click_field->Widget()->WindowHandle();

                        ::PostMessage(hWindow , OLE_NOTIFY , (WPARAM)hEntryWnd , OLE_LCLICK);
                        /*pEvent.SetVariables(p_click_field , evClick ,etFormField , true , p_context_interface);
                        SetEvent(hEventWnd);*/
                        fprintf(trace_event , "buttonClick\t%x\n" , msg->hwnd );
                        fflush(trace_event);
                        break;
                    case WM_RBUTTONDOWN:
                        fprintf(trace_event , "RightClick\n");
                        fflush(trace_event);
                        break;
                    case WM_LBUTTONDBLCLK:
                        fprintf(trace_event , "ButtonDoubleClick\n");
                        fflush(trace_event);
                        break;
                }
            }
        }

        break;
      default:
        break;
    }
    return CallNextHookEx(hook, nCode, wParam, lParam); 
}    

While clicking the left mouse button, the code above went into the case WM_LBUTTONDOWN for more than 30 times. Is there something wrong with my code? If so, how can I fix it?

karthik
  • 17,453
  • 70
  • 78
  • 122
  • 1
    you can just google if you just want to see any random example. Do you have a more specific question? What have you tried? Most importantly: What kind of hook? For what purpose? – tenfour Feb 11 '11 at 11:40
  • I have handle of ole widgets and using that handle , i have to keep track of mouse click events and setfocus and kill focus events. – karthik Feb 11 '11 at 11:43
  • for that i need some basic idea of hook procedure – karthik Feb 11 '11 at 11:43
  • As this is now a real question about problems with a mouse hook procedure, I'm voting to re-open. – Cody Gray - on strike Feb 15 '11 at 05:28
  • I made the mistake in using the function SetWindowsHookEx(). I list out the problems, 1)Calling this function in infinite getmessage() while loop. 2)we have to release the hook by UnhookWindowsHookEx() function. – karthik Feb 15 '11 at 06:54

1 Answers1

2

Are you clicking the mouse button more than 30 times? There will be an WM_LBUTTONDOWN message sent each the the mouse button is clicked, even if it is part of a double-click. That's a consequence of how Windows recognizes a double-click in the absence of a way to go back in time.

This sample looks trustworthy, and was written by a fairly reputable author:

     Hooks and DLLs

Bhargav Rao
  • 50,140
  • 28
  • 121
  • 140
Cody Gray - on strike
  • 239,200
  • 50
  • 490
  • 574