//当前进程钩子
m_hHook1 = ::SetWindowsHookEx(WH_GETMESSAGE, CallNextHookEx,NULL, 0);
//全局钩子
m_hHook1 = ::SetWindowsHookEx(WH_GETMESSAGE,
CallNextHookEx,AfxGetInstanceHandle(), 0);
备注:全局钩子,容易被其他程序占用,查看进程钩子PCHunter
知识点:使用Windows HOOK所需要的核心函数不多,只有四个:
HOOK 子程:HOOK的处理函数,如GetMsgProc, KeyboardProc等
1、SetWindowsHookEx():安装一个HOOK
HHOOK SetWindowsHookEx(
int idHook,
HOOKPROC lpfn,
HINSTANCE hMod,
DWORD dwThreadId
);
第一个参数idHook用来标识HOOK类型,比如鼠标信息用WH_MOUSE,键盘消息用WH_KEYBOARD等,更多参数和功能请查阅MSDN
第二个参数lpfn指向一个具体的HOOK子程,用于实际处理拦截的消息
第三个参数hMod用来标识HOOK子程所在的模块,如果是一个全局HOOK,则是一个载入内存的DLL句柄(使用GetModuleHandle得到);如果是一个内部线程HOOK,则为NULL即可。
第四个参数dwThread指明HOOK的范围,如果是0则表示监视运行在同一个窗口下的所有线程,否则指定一个具体的线程ID即可。
2、UnhookWindowsHookEx():卸载一个HOOK
BOOL UnhookWindowsHookEx(
HHOOK hhk
);
3、CallNextHookEx():调用HOOK链的下一个HOOK子程
LRESULT CallNextHookEx(
HHOOK hhk,
int nCode,
WPARAM wParam,
LPARAM lParam
);
这里的nCode需要我们填写传送个下一个HOOK子程的代码,如果是HC_ACTION,则wParam和lParam包含消息信息;如果是HC_NOREMOVE则wParam和lParam包含消息信息外,消息不能从消息队列中移除: