2010-01-27 67 views
1

我通过调用API挂钩程序后无限调用

xzxx xzxx xzxx

挂钩WM_SETFOCUS消息钩子程序是

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。但是一旦我点击确定,就会弹出另一条消息。

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

我做错了什么。

+0

是啊看起来像消息框引起的问题。 我删除了消息框并打印了调试语句,我的钩子程序调用了4,5次,直到键盘集中控制。 – anand 2010-01-27 05:50:46

回答

4

快速猜测 - 不关闭消息框强制重新控制的焦点,因此再次调用你的函数?

+0

+1我认为这是问题所在。 – gyurisc 2010-01-27 05:49:29

2

我认为问题在于用消息框取消焦点,当点击确定时,将焦点返回给控件,因此您的钩子会再次被调用。我建议尝试使用OutputDebugString打印出某些内容,而不是使用消息框。

0

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

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