windows钩子函数

钩子实际上是一个处理消息的程序段,通过系统调用,把它挂入系统。每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权。这时钩子函数即可以加工处理(改变)该消息,也可以不作处理而继续传递该消息,还可以强制结束消息的传递

相关API

  • SetWindowsHookEx安装钩子
    • 如果钩子需要关联当前系统所有窗口。则需要在DLL动态库中安装钩子
  • UnhookWindowsHookEx卸载钩子
g_hHook = ::SetWindowsHookEx(
    WH_KEYBOARD,     //钩子类型:键盘钩子
    KeyboardProc,    //回调函数
    NULL,            //局部钩子:填 NULL 全局钩子:填DLL的模块句柄
    GetCurrentThreadId());//当前线程 填 NULL则挂所有窗口线程
    
UnhookWindowsHookEx(g_hHook);//卸载钩子
  • 回调函数
  • KeyboardProc
    • 返回值:若为非0值,则不把消息传递给钩子链中的下一个钩子,直接发送给目标窗口
- LRESULT CALLBACK `KeyboardProc`
(int code,       // hook code
  WPARAM wParam,  // virtual-key code
  LPARAM lParam   // keystroke-message information
  )
{
  //nCode小于零,必须立即调用 CallNextHookEx并返回
  if (code < 0)
  {
    return CallNextHookEx(g_hHook, code, wParam, lParam);
  }

  if (code == HC_ACTION)
  {
    TCHAR szBuff[MAXBYTE];
    wsprintf(szBuff, TEXT("KeyboardProc: %c"), wParam);
    OutputDebugString(szBuff);
  }

// 钩子无法更改具体消息携带的数据,只能做监视使用
  wParam = 0x123;  //设置无效
  lParam = 0x789;  //设置无效
  return CallNextHookEx(g_hHook, code, wParam, lParam);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章