一不小心点了一下csdn的blog,却发现自己不知道什么时候已经注册了,嘿嘿,一直也没有在这里留下任何印记,罪过。刚好今天看了孙鑫的最后一课,写一下自己对HOOK的理解吧。
HOOK,也就是钩子函数,要理解这个,首先要明白windows的回调机制。windows程序必须要有一个窗口,有了窗口才能接收消息。当收到任何消息的时候,总是由windows系统来对程序在注册窗口类的时候注册的窗口函数进行调用,发给程序的所有的消息都是在这个窗口过程中进行处理。那么我们想拦截消息的话,最方便的地方应该是在哪里?
当然是在系统调用窗口函数前,在系统中对消息进行拦截。而HOOK函数的作用就是这个,使用HOOK前先要进行安装,调用SetWindowsHookEx函数,其函数原型为:
HHOOK SetWindowsHookEx( int idHook, // hook type HOOKPROC lpfn, // hook procedure HINSTANCE hMod, // handle to application instance DWORD dwThreadId // thread identifier );
第一个参数为HOOK类型,也就是你要选择键盘钩子还是鼠标钩子(当然钩子的种类很多,自己慢慢选:))
第二个参数就是钩子回调函数,也就是你勾挂上消息(拦截消息总不能白拦截吧,起码打上自己的标记吧)
后,可以在这个函数中对消息进行处理,方法同窗口回调函数。
第三个参数是一个DLL句柄,如果你安装一个本地钩子,那么就应该把这个参数设为NULL,否则就
应该是你的钩子函数所在的DLL的句柄(除了本地钩子外,其他钩子都应该在一个DLL文件中,这个我也
不知道为什么,呵呵)。
第四个参数是线程ID,如果是本地钩子,用函数GetCurrentThreadID就好,如果这个参数为0,
那么就安装一个全局钩子,也就是说系统桌面上运行的所有程序的消息都要先从你这里经过,
厉害吧,如果在这里随便做个手脚,呵呵。
这个函数的返回值是一个HHOOK的句柄,一般在卸载钩子的时候使用。
说了安装,当然要说卸载了。
卸载的时候使用UnhookWindowsHookEx这个函数
BOOL UnhookWindowsHookEx( HHOOK hhk // handle to hook procedure );
其中唯一的参数就是前面安装的时候的HHOOK句柄,当然你安装了几个钩子就要卸载几次了。
一下子打了这么多,累啊。