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);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章