Windows中的消息截获

文章作者 100test 发表时间 2011:03:18 20:32:06
来源 100Test.Com百考试题网


  由于本人能力有限,所以实现钩子的方法一定不是是最好的,但简单。
  本来一直打算做个APM计数器的,所谓APM计数器,就是一个全局的计算键盘鼠标平均时间下的操作量啦。如果玩过星际争霸或者魔兽争霸的一定知道APM的意义。
  为了实现全局的统计键盘和鼠标操作,我采用了HOOK的方法进行了实现,具体如下。
  首先建立一个DLL得工程,这个工程的主要目的就是进行钩子并且通过函数指针对主程序进行通知。
  其头文件如下:
  #ifdef _COMPILING_44E531B1_14D3_11d5_A025_006067718D04
  #define LIBSPEC __declspec(dllexport)
  #else
  #define LIBSPEC __declspec(dllimport)
  #endif
  LIBSPEC BOOL setMouseHook().
  LIBSPEC BOOL setKeyBoardHook().
  LIBSPEC BOOL setMsgHook().
  LIBSPEC BOOL clearAllHook().
  typedef int (*FucOnMouse)(int mousex,int mousey) .
  LIBSPEC void setHookFuncMouse(FucOnMouse ptFuc).
  typedef int (*FucOnKeyBoard)(long code, long scancode,long flags).
  LIBSPEC void setHookFuncKeyBoard(FucOnKeyBoard ptFuc).
  typedef int (*FucOnMsg)(WPARAM wParam, LPARAM lParam).
  LIBSPEC void setHookFuncMsg(FucOnMsg ptFuc).
  #undef LIBSPEC
  而后是源文件:
  HINSTANCE hInst.
  HHOOK hookkeyboard = NULL.
  static LRESULT WINAPI KeyBoardProc(int nCode,WPARAM wparam,LPARAM lparam) .
  BOOL APIENTRY DllMain( HINSTANCE hInstance,
  DWORD Reason,
  LPVOID Reserved
  )
  {
  switch(Reason)
  { /* reason */
  case DLL_PROCESS_ATTACH:
  hInst = hInstance.
  return TRUE.
  case DLL_PROCESS_DETACH:
  return clearAllHook().
  } /* reason */
  return TRUE.
  }
  //主程序如果要对键盘消息进行截获就调用这个函数
  __declspec(dllexport) BOOL setKeyBoardHook()
  {
  if (hookkeyboard!=NULL)
  {
  return TRUE.
  }
  hookkeyboard = SetWindowsHookEx(WH_KEYBOARD_LL,KeyBoardProc,hInst,0).
  if(hookkeyboard!=NULL)
  { /* success */
  return TRUE.
  }
  return FALSE. // failed to set hook
  }
  //然后在主程序中设置一个函数指针来处理键盘消息。
  static FucOnMouse g_ptfucmouse = NULL.
  __declspec(dllexport) void setHookFuncMouse(FucOnMouse ptFuc)
  {
  g_ptfucmouse = ptFuc.
  }
  //这部分就是HOOK的时候传入的处理函数啦

相关文章


2011年计算机二级C 考试备考冲刺攻略
计算机二级辅导:VisualC 链接器选项
C Builder定制系统菜单
你应当如何学习C (以及编程)
Windows中的消息截获
动态规划求0_1背包问题
用动态规划实现导弹拦截
贪心算法
RPC远程过程调用实例详解
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛