使用HOOK 截获消息与Windows消息循环相似,编写一个hook程序首先需要安装钩子接受消息,然后通过钩子截获消息。
安装钩子可以使用SetWindowsHookEx函数
HHOOK SetWindowsHookEx( int idHook, // type of hook to install HOOKPROC lpfn, // address of hook procedure HINSTANCE hMod, // handle to application instance DWORD dwThreadId // identity of thread to install hook for );
钩子的类型有具体查看MSDN.
lpfn 钩子过程,类似窗口过程函数
hmod 全局钩子需要指定参数
dwthreadid 线程钩子需要指定参数
注意:不同的钩子类型用不同的钩子过程,同时线程钩子和全局钩子不能同时指定。
全局钩子必须要“封装”在dll中
下面以使用全局钩子,获取键盘消息作为示例
1,在win32dll中编写如下代码
#include "stdafx.h" HHOOK g_hKeyHook=NULL; HINSTANCE g_hInstanceDLL=NULL; BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { //得到DLL模块的句柄 if (ul_reason_for_call==DLL_PROCESS_ATTACH) { g_hInstanceDLL=(HINSTANCE)hModule; } return TRUE; } LRESULT CALLBACK MyKeyboardProc(int code,WPARAM wParam,LPARAM lParam) { if (lParam>>31==0) { //0x20000000表示二进制表示0010 0000 0000 0000 0000 0000 0000 0000 //lParam 的第29位表示ALT 是否被按下 if (lParam&0x0000000) { if (wParam==VK_F4) { if (::MessageBox(NULL, "您按下了ALT+F4键!/n 是否确认关闭?", "提示",MB_YESNO)==IDNO) { //如果选择否,将不会将ALT+F4传递给窗口 //如果1表示不发送给窗口 return 1; } } } } return ::CallNextHookEx(g_hKeyHook,code,wParam,lParam); } //安装钩子 _declspec(dllexport) void SetHook() { g_hKeyHook=SetWindowsHookEx( WH_KEYBOARD, MyKeyboardProc, g_hInstanceDLL, 0); } //停止钩子 _declspec(dllexport) void StopHook() { UnhookWindowsHookEx(g_hKeyHook); }
2,生成的dll文件和普通的dll文件使用是一样的大致步骤相同