鉤子實際上是一個處理消息的程序段,通過系統調用,把它掛入系統。每當特定的消息發出,在沒有到達目的窗口前,鉤子程序就先捕獲該消息,亦即鉤子函數先得到控制權。這時鉤子函數即可以加工處理(改變)該消息,也可以不作處理而繼續傳遞該消息,還可以強制結束消息的傳遞
相關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);
}