0

WindowsAPIを使用してマウスフックを作成しようとしています。現在、私は次のコードを持っていますが、それを機能させるのに苦労しています。おそらく、いくつかのサンプルコードは、概念をよりよく理解するのに役立つでしょう。

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); 
}    

マウスの左ボタンをクリックしているときに、上記のコードWM_LBUTTONDOWNが30回以上ケースに入った。私のコードに何か問題がありますか?もしそうなら、どうすればそれを修正できますか?

4

1 に答える 1

2

マウスボタンを30回以上クリックしていますか?ダブルクリックの一部であっても、マウスボタンがクリックされるたびWM_LBUTTONDOWNにメッセージが送信されます。これは、時間をさかのぼる方法がない場合にWindowsがダブルクリックを認識する方法の結果です。

このサンプルは信頼できるように見え、かなり評判の良い作者によって書かれました。

     フックとDLL

于 2011-02-11T11:47:11.003 に答える