安装一个 键盘钩子
SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)HookFun,(HINSTANCE)AfxGetApp()->m_hInstance,0);回调函数
LRESULT CALLBACK HookFun(int code,WPARAM wParam,LPARAM lParam)
{
     MSG *msg=(MSG*)lParam;
     if (msg->message==WM_CHAR)
     {
       AfxMessageBox("Hook Run");
     }
     return 1;
}LRESULT CALLBACK HookFun(int code,WPARAM wParam,LPARAM lParam)
{
  if (code==HC_ACTION && (lParam & 0xc000ffff) == 1)
  {
      AfxMessageBox("Hook Run");
  }
     return 1;
}发觉第二种有响应 第一种为什么没响应?
都是网上找的代码 没搞明白 有人能解释下不?

解决方案 »

  1.   

    键盘钩子怎么会有WM_CHAR消息,WM_CHAR消息是TranslateMessage产生的。用WH_GETMESSAGE可以钩到WM_CHAR消息。
      

  2.   

    键盘钩子的消息函数中的参数内容KeyboardProc FunctionwParam
        [in] Specifies the virtual-key code of the key that generated the keystroke message.
    lParam
        [in] Specifies the repeat count, scan code, extended-key flag, context code, previous key-state flag, and transition-state flag. For more information about the lParam parameter, see Keystroke Message Flags. This parameter can be one or more of the following values.
      

  3.   

    安装钩子改为 
    SetWindowsHookEx(WH_GETMESSAGE,(HOOKPROC)RecHook,(HINSTANCE)AfxGetApp()->m_hInstance,0);第一种还是没反应
      

  4.   


    恩 使用 WH_KEYBOARD 可以取得按键值。不过处理键值有点累 要枚举
    我觉得 MSG的 可能方便些
      

  5.   

    LRESULT CALLBACK RecHook(int nCode,WPARAM wParam,LPARAM lParam)
    {     MSG *msg=(MSG*)lParam;
     
         if (msg->message==WM_CHAR)
         {
    MessageBox(NULL,(CString)msg->wParam,NULL,MB_OK); 
         } 
        return 1;
    }就是 按什么键提示什么键
      

  6.   

    包括区分大小写 用WH_KEYBOARD 好像区分不了大小写和 上档键
      

  7.   

    代码没什么大问题,应该是你的程序在消息循环中没有调用TranslateMessage,是不是你重载了PreTranslateMessage把一些按键消息过滤掉了?你可以在界面上放一个编辑框试试。
      

  8.   

    哦 我需要的是单独使用钩子就可以取得 按键就好正是因为我的代码不是继承自cwnd类
    所以 不支持PreTranslateMessage取得消息 所以想用钩子来取得按键明天来看 谢谢回复
      

  9.   

    只要消息循环中正常执行TranslateMessage就会产生WM_CHAR消息。
      

  10.   

    我测试的环境是 一个对话框 
    加上 一个按钮 用来安装钩子 SetWindowsHookEx
    安装钩子后
    需要的结果就是 点什么 提示什么