问题:程序只设置了一个钩子,但是钩子函数的反应却是两次,为什么?
钩子函数是按正常的步骤走的:
1、LRESULT CALLBACK HookFun(int nCode,WPARAM wParam,LPARAM lParam)//定义钩子函数
2、在上面的钩子函数中返回:return CallNextHookEx(g_hHook,nCode,wParam,lParam);
3、在按键处理函数中添加:
   g_hHook=SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)HookFun,NULL,GetCurrentThreadId());
4、在另一个按键处理函数中添加:
   UnhookWindowsHookEx(g_hHook);
问题如上,为什么会出现这种问题呢,如何解决这种问题?
谢谢各位好心的朋友帮忙解答!!!

解决方案 »

  1.   

    是不是按一个键,产生KeyUp和KeyDown两个事件?看一下wParam和lParam再说?
      

  2.   

    应该不会吧,给你看看我的钩子函数吧:
    LRESULT CALLBACK HookFun(int nCode,WPARAM wParam,LPARAM lParam)//定义钩子函数
    {
    CString strTmp="";
    if(nCode==HC_ACTION)
    switch(wParam)
    {
    case 0x08:                       //回车键
    case 0x0A:                       //linefeed
    case 0x1B:                       //escaps
    case 0x09:                      //"tab"键
    case 0x0D:                      //return
    break;
    default:
    ch[0]=(TCHAR)wParam;
    MessageBox(NULL,ch,"Catch the letter!",MB_OK);
    }
    return CallNextHookEx(g_hHook,nCode,wParam,lParam);
    }
    你说的wparam和lparam参数,我只了解他们是传递的参数,具体是有什么影响,我也不知道啊!
    能否解释下?
      

  3.   

    明显的一次按键,两次激发的问题,给你的标准的键盘钩子代码:
    __declspec(dllexport)   LRESULT   CALLBACK   KeyboardProc(int   nCode,   WPARAM   wParam,   LPARAM   lParam)   
      {   
      if(   HC_ACTION==nCode   &&   lParam   &   0x40000000)   
      {   
      ........
      }   
      return   CallNextHookEx(m_hHook,   nCode,   wParam,   lParam);   
      }   
    注意红色的部分就是避免你所说的问题的处理方法
    具体的lParam的参数的意义去看MSDN,应该是这个参数的第30位还是第31位标识了当前按键事件是弹起还是按下。