【问题标题】:After hooking hook procedure is called infinitely挂钩后挂钩程序被无限调用
【发布时间】:2010-01-27 05:41:54
【问题描述】:

我已经通过调用 API 钩住了 WM_SETFOCUS 消息

hhookCallWndProc = SetWindowsHookEx(WH_CALLWNDPROC, HookCallWndProc, hInst, threadID);

钩子程序是

extern "C"   LRESULT _declspec(dllexport) __stdcall CALLBACK HookCallWndProc(int nCode, WPARAM wParam, LPARAM lParam)
    {
      if (nCode == HC_ACTION) {
        CWPSTRUCT* info = (CWPSTRUCT*) lParam;
        if(info->message == WM_SETFOCUS )
        {
            if(info->hwnd == hControl)
            {
                MessageBox(NULL,L"Focus on control",L"Focus",MB_OK);
                }
        }
      }
      return CallNextHookEx(hhookCallWndProc , nCode, wParam, lParam);
    }

现在当我专注于控件时,这个钩子过程被调用了。显示消息框。但是当我点击 Ok 时,会弹出另一条消息。

消息不断弹出。 每当我专注于控制时,我只想获取一次消息框,但在这里我会无限地获取消息。

我做错了什么。

【问题讨论】:

  • 是的,看起来像是消息框导致了问题。我删除了消息框并打印了调试语句,我的钩子程序调用了 4.5 次,直到键盘专注于控制。

标签: c++ winapi hook


【解决方案1】:

快速猜测 - 关闭消息框不会强制重新聚焦控件并因此再次调用您的函数吗?

【讨论】:

    【解决方案2】:

    我认为问题在于,使用消息框时,您会带走焦点,当单击“确定”时,您会将焦点归还给控件,因此再次调用您的钩子。我建议尝试使用OutputDebugString 打印一些内容,而不是使用消息框。

    【讨论】:

      【解决方案3】:

      每当调试您的应用程序时,最好创建日志文件以保存信息。 您已评论键盘事件被跟踪超过四次。

      • 这主要取决于你在哪里使用 SetWindowsHookEx() 函数。
      • 您可以通过正确卸载挂钩功能来消除此问题。

      【讨论】:

        猜你喜欢
        • 2021-12-07
        • 2020-08-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多