代码之家  ›  专栏  ›  技术社区  ›  anand

钩住钩子后,程序被无限地调用

  •  1
  • anand  · 技术社区  · 16 年前

    我通过调用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);
        }
    

    现在,当我将焦点放在控件上时,调用这个钩子过程。显示消息框。但只要我单击“确定”,就会弹出另一条消息。

    消息不断地出现。 我只想在关注控制的时候获得一次MessageBox,但是这里我得到的消息是无限的。

    我做错了什么。

    3 回复  |  直到 15 年前
        1
  •  4
  •   Max Shawabkeh    16 年前

    快速猜测-关闭消息框是否会强制控件重新聚焦,从而再次调用函数?

        2
  •  2
  •   gyurisc    16 年前

    我认为问题在于,使用消息框时,您会拿走焦点,单击“确定”时,会将焦点返回控件,因此再次调用挂钩。我建议用 OutputDebugString 而不是使用消息框。

        3
  •  0
  •   karthik    15 年前

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

    • 这主要取决于使用setWindowsHookEx()函数的位置。
    • 您可以通过正确卸载hook函数来消除这个问题。