WINDOWS钩子函数
点击次数:54 次 发布日期:2008-11-10 08:13:19 作者:源代码网
|
源代码网整理以下 本课中我们将要学习WINDOWS钩子函数的使用方法。WINDOWS钩子函数的功能非常强大,有了它您可以探测其它进程并且改变其它进程的行为。 软件开发网 www.mscto.com 源代码网推荐在正确使用钩子函数前,我们先讲解钩子函数的工作原理。当您创建一个钩子时,WINDOWS会先在内存中创建一个数据结构,该数据结构包含了钩子的相关信息,然后把该结构体加到已经存在的钩子链表中去。新的钩子将加到老的前面。当一个事件发生时,如果您安装的是一个局部钩子,您进程中的钩子函数将被调用。如果是一个远程钩子,系统就必须把钩子函数插入到其它进程的地址空间,要做到这一点要求钩子函数必须在一个动态链接库中,所以如果您想要使用远程钩子,就必须把该钩子函数放到动态链接库中去。当然有两个例外:工作日志钩子和工作日志回放钩子。这两个钩子的钩子函数必须在安装钩子的线程中。原因是:这两个钩子是用来监控比较底层的硬件事件的,既然是记录和回放,所有的事件就当然都是有先后次序的。所以如果把回调函数放在DLL中,输入的事件被放在几个线程中记录,所以我们无法保证得到正确的次序。故解决的办法是:把钩子函数放到单个的线程中,譬如安装钩子的线程。 源代码网推荐钩子一共有14种,以下是它们被调用的时机: 源代码网推荐WH_CALLWNDPROC 当调用SendMessage时 源代码网推荐WH_CALLWNDPROCRET 当SendMessage的调用返回时 源代码网推荐WH_GETMESSAGE 当调用GetMessage 或 PeekMessage时 源代码网推荐WH_KEYBOARD 当调用GetMessage 或 PeekMessage 来从消息队列中查询WM_KEYUP 或 WM_KEYDOWN 消息时 源代码网推荐WH_MOUSE 当调用GetMessage 或 PeekMessage 来从消息队列中查询鼠标事件消息时 源代码网推荐WH_HARDWARE 当调用GetMessage 或 PeekMessage 来从消息队列种查询非鼠标、键盘消息时 源代码网推荐WH_MSGFILTER 当对话框、菜单或滚动条要处理一个消息时。该钩子是局部的。它时为那些有自己的消息处理过程的控件对象设计的。 源代码网推荐WH_SYSMSGFILTER 和WH_MSGFILTER一样,只不过是系统范围的 源代码网推荐WH_JOURNALRECORD 当WINDOWS从硬件队列中获得消息时 源代码网推荐WH_JOURNALPLAYBACK 当一个事件从系统的硬件输入队列中被请求时 源代码网推荐WH_SHELL 当关于WINDOWS外壳事件发生时,譬如任务条需要重画它的按钮. 源代码网推荐WH_CBT 当基于计算机的训练(CBT)事件发生时 源代码网推荐WH_FOREGROUNDIDLE 由WINDOWS自己使用,一般的应用程序很少使用 源代码网推荐WH_DEBUG 用来给钩子函数除错 源代码网推荐现在我们知道了一些基本的理论,现在开始讲解如何安装/卸载一个钩子。 源代码网推荐要安装一个钩子,您可以调用SetWindowHookEx函数。该函数的原型如下: 源代码网推荐SetWindowsHookEx proto HookType:DWORD, pHookProc:DWORD, hInstance:DWORD, ThreadID:DWORD 源代码网推荐HookType 是我们上面列出的值之一,譬如: WH_MOUSE, WH_KEYBOARD 源代码网推荐 源代码网供稿. |
