使用HOOK 截获消息与Windows消息循环相似,编写一个hook程序首先需要安装钩子接受消息,然后通过钩子截获消息。
安装钩子可以使用SetWindowsHookEx函数
钩子的类型有具体查看MSDN.
lpfn 钩子过程,类似窗口过程函数
hmod 全局钩子需要指定参数
dwthreadid 线程钩子需要指定参数
注意:不同的钩子类型用不同的钩子过程,同时线程钩子和全局钩子不能同时指定。
全局钩子必须要“封装”在dll中
下面以使用全局钩子,获取键盘消息作为示例
1,在win32dll中编写如下代码
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文件使用是一样的大致步骤相同