钩子安装

钩子安装
2000-03-18· maco·cpcw
  钩子是微软消息处理机制的一种,通过钩子应用程序可以安装一个小程序或子程序来监视系统中消息的传递,还你在消息到达窗口过程前处理其他的消息。
  讲到钩子我们先讲一下钩子链。系统中包含了不同种类的钩子,每种钩子有自己独有的功能,而且每种钩子提供一种WINDOWS系统消息处理机制不同方向的通道。钩子链是系统为每一种钩子方便管理而建立的一种链,他是一个回调函数的指针列表。钩子的操作取决于钩子的类型,有的钩子只能监视,而有的钩子可以修改和停止他们在链中的进程、禁止他们到达下一个钩子过程或目的窗口。
  有一点是在编程当中要非常注意的。用钩子要注意快进快出,所谓快进快出就是当用到钩子的时候安装,不用的时候删除,以防止钩子影响系统的正常工作。
安装钩子
要想用到某种钩子,必须先要给出钩子的过程,并且用SetWindowHookEx()函数把他安装到这个钩子相应的链中去。
函数的原型如下:
SetWindowsHookEx(
int idHook;
HOOKPROC lpfn;
HINSTANCE hMod;
DWORD dwThreadId;
);
这个函数成功时返回这个钩子的句柄,如果失败,返回NULL。
参数说明:
idHook 是安装钩子的类型,钩子的类型如下表
钩子类型 说明
WH_CALLWNDPROC 系统将消息发送到指定窗口的钩子
WH_CALLWNDPROCRET 消息已经在窗口中处理的钩子
WH_CBT 基于计算机培训的钩子
WH_DEBUG 查错的钩子
WH_FOREGROUNDIDLE 前台空闲钩子
WH_GETMESSAGE 接收消息投递的钩子
WH_JOURNALPLAYBACK 回放以前通过WH JOURNALRECORD钩子记录的输入消息
WH_JOURNALRECORD 输入消息记录的钩子
WH_KEYBOARD 键盘消息钩子
WH_MOUSE 鼠标消息
WH_MSGFILTER 对话框、消息框、菜单或滚动条输入消息钩子
WH_SHELL 外壳钩子
WH_SYSMSGFILTER 系统消息钩子

Lpfn 指向钩子过程的指针。如果dwThreadId为0,或者dwThreadId是凌夷个进程创建的,那么lpfn指向的钩子必须在动态链接库中。DwThreadId非0的话,那么dwThreadId标识的线程由当前线程创建,则lpfn指向的钩子过程可以属于当前进程。
HMod 钩子过程所在的模块的句柄。如果dwThreadId标识的线程由当前进程创建的话,且lpfn指向的钩子过程属于当前进程,那么hMod必须为0。
DwThreadId 钩子相关线程的标识。如果想要截获发给所有线程的消息,dwThreadId必须为0。
通常安装钩子有两种方法:
第一种 是把钩子做成动态链接文件,并且在代码编译的时候直接链接。这种方法比较简单 ,应用程序不需要DLL模块的句柄。这种钩子是全局的钩子,应该考虑到在链接文件中提供释放这种钩子的函数,以便应用程序在结束时调用这个钩子释放函数。
第二种 也是把钩子做成动态链接文件,但不是在代码编译的时候直接链接,而是在用的时候调用,不用的时候释放。这个过程虽然比较麻烦,但是有时为了提高系统的工作效率还是很有效的。他的步骤如下:
HOOKPROC hkprcXX;
static HINSTANCE hinstDLL;
static HHOOK hhookXX;
hinstDLL=LoadLibrary((LPCTSTR)””);
hkprcXX=(HOOKKPROC)GetProcAddress(hinstDLL,”XXProc”);
hhook=SetWindowsHookEx(WH_XX,hkprcXX,hinstDLL,0);
***这里的XX代表钩子类型***
  如果一个由某种钩子监视的事件发生,系统会自动调用相应类型的钩子链开始处的钩子过程,每一个钩子过程都要考虑是否把事件传递给下一个过程。如果要传到下一个过程,就调用CallNextHookEx()函数。
函数原型如下:
LRESULT CallNextHookEx(
HHOOK hhk;
int nCode;
WPARAM wParam;
LPARAM lParam;
);
参数说明:
hhk 为当前钩子的句柄。他是由SetWindowsHookEx()函数返回的。
nCode 是传递给钩子过程的事件代码。
WParam和lParam 分别是传递给下一个钩子过程的wParam 和lParam值。他于钩子的类型有关。
通常他是放在钩子的末尾的。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值