【问题标题】:Problems with creating a mouse hook using the Windows API [closed]使用 Windows API 创建鼠标挂钩的问题 [关闭]
【发布时间】:2011-02-11 11:38:16
【问题描述】:

我正在尝试使用 Windows API 创建鼠标挂钩。目前,我有以下代码,但我正在努力使其工作。也许一些示例代码可以帮助我更好地理解这些概念。

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 多次。我的代码有问题吗?如果是这样,我该如何解决?

【问题讨论】:

  • 如果你只是想看看任何随机的例子,你可以用谷歌搜索。你有更具体的问题吗?你试过什么?最重要的是:什么样的钩子?目的是什么?
  • 我有 ole 小部件的句柄,使用该句柄,我必须跟踪鼠标单击事件以及 setfocus 和终止焦点事件。
  • 为此我需要一些钩子程序的基本概念
  • 由于这是一个关于鼠标钩程序问题的真正问题,我投票重新打开。
  • 我在使用 SetWindowsHookEx() 函数时犯了错误。我列出了问题,1)在无限getmessage()while循环中调用这个函数。 2)我们必须通过 UnhookWindowsHookEx() 函数释放钩子。

标签: c++ winapi visual-c++ hook mouse-hook


【解决方案1】:

您是否单击鼠标按钮超过 30 次? 每个鼠标按钮被单击时都会发送WM_LBUTTONDOWN 消息,即使它是双击的一部分。这是 Windows 如何在没有及时返回的情况下识别双击的结果。

这个样本看起来值得信赖,并且是由一位相当有名的作者编写的:

     Hooks and DLLs

【讨论】:

  • 我更新了我的示例代码。请查看。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-19
  • 1970-01-01
  • 2011-07-19
  • 1970-01-01
  • 2018-10-21
相关资源
最近更新 更多