所谓钩子函数就是对windows下的如(键盘或鼠标)等消息的过滤处理,通过钩子回调函数来进行截留处理。
一共有两种类型的
钩子:局部的和远程的。
局部
钩子仅钩挂您自己进程的事件。
远程的
钩子还可以将钩挂其它进程发生的事件。
远程的
钩子又有两种:
钩子分两种, 一种是系统级的全局钩子; 一种是线程级的钩子.全局钩子函数需要定义在 DLL 中, 线程级的钩子开始比较简单.
其实钩子函数就三个:
设置钩子:
SetWindowsHookEx
释放钩子:
UnhookWindowsHookEx
继续钩子:
CallNextHookEx
在线程级的钩子中经常用到 GetCurrentThreadID 函数来获取当前线程的 ID
SetWindowsHookEx( __in int idHook, __in HOOKPROC lpfn, __in_opt HINSTANCE hmod, __in DWORD dwThreadId);
idHook是钩子的类型
类型如下:
lpfn是钩子回调函数,也是过滤函数。
当为局部钩子时,第三个参数一般为null,第四个线程idGetCurrentThreadId()
当为全局钩子时,第三个参数为dll实例句柄,第四个参数为0
局部钩子实例如下:取消键盘退出键消息
WPARAM为产生的虚拟键值
g_hook = SetWindowsHookEx( WH_KEYBOARD, hookproc, NULL, GetCurrentThreadId() )
LRESULT CALLBACK hookproc(int code, WPARAM wParam, LPARAM lParam)
{
if( wParam == VK_ESCAPE )
return 1;
else
{
return
CallNextHookEx( g_hook, code, wParam, lParam );
}
{
if( wParam == VK_ESCAPE )
return 1;
else
{
return
CallNextHookEx( g_hook, code, wParam, lParam );
}
CallNextHookEx( g_hook, code, wParam, lParam );为调用下一个钩子函数
全局钩子:需要创建动态库dll,实例如下 取消键盘消息
HHOOK g_hook = NULL;
LRESULT CALLBACK hookdl( int code, WPARAM wparm, LPARAM lparm );
HOOK_API void SetHook()
{
g_hook = SetWindowsHookEx( WH_KEYBOARD, hookdl, GetModuleHandle("hook") , 0);
}
LRESULT CALLBACK hookdl( int code, WPARAM wparm, LPARAM lparm )
{
return 1;
}
}
UnhookWindowsHookEx() 为移除钩子句柄,从钩子连中移走一个已安装的钩子
当您创建一个
钩子时,WINDOWS会先在内存中创建一个
数据结构,该数据结构包含了钩子的相关信息,然后把该
结构体加到已经存在的钩子链表中去。新的
钩子将加到老的前面。当一个事件发生时,如果您安装的是一个局部
钩子,您进程中的钩子函数将被调用。如果是一个远程
钩子,系统就必须把钩子函数插入到其它进程的
地址空间,要做到这一点要求钩子函数必须在一个
动态链接库中,所以如果您想要使用远程钩子,就必须把该钩子函数放到动态链接库中去。