回调函数和钩子函数

604 篇文章 8 订阅
579 篇文章 5 订阅
所谓回调函数,一般就是把函数的地址作为参数传进去,让调用的函数在内部可以调用这个函数。
例子:
void CALLBACK fun(){...} 这是一个函数,回调函数
void AAA(int a, Fun* p); 这是一个普通函数,但第二个参数是fun
AAA(5, fun);  

钩子函数,严格算起来,也算是回调函数的一种。但钩子函数是针对的截取的,当你使用了钩子之后,每当触发到相对应的消息,
系统就会先“执行你写的回调函数”。
即原本是:系统-->目标函数
使用钩子就变成:系统-->你写的回调函数-->目标函数

----------------------------------我是分割线-------------------------------
回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,
当这个指针被用为调用它所指向的函数时,我们就说这是回调函数。

回调函数实际上就是在调用某个函数(通常是API函数)时,将自己的一个函数(这个函数为回调函数)的地址(函数指针)
作为参数传递给那个函数。而那个函数在需要的时候,
利用传递的地址调用回调函数,这时你可以利用这个机会在回调函数(自己写的这个函数)中处理消息或完成一定的操作。
钩子实际上是一个处理消息的程序段,通过系统调用,把它挂入系统。每当特定的消息发出,在没有到达目的窗口前, 钩子程序就先捕获该消息,亦即钩子函数先得到控制权。这时钩子函数即可以加工处理(改变)该消息, 也可以不作处理而继续传递该消息,还可以强制结束消息的传递。对每种类型的钩子由系统来维护一个钩子链, 最近安装的钩子放在链的开始,而最先安装的钩子放在最后,也就是后加入的先获得控制权。要实现Win32的系统钩子, 必须调用SDK中的API函数SetWindowsHookEx来安装这个钩子函数,这个函数的原型是 HOOK   SetWindowsHookEx(int   idHook,HOOKPROC   lpfn,HINSTANCE   hMod,DWORD   dwThreadId);, 其中,第一个参数是钩子的类型; 第二个参数是钩子函数的地址; 第三个参数是包含钩子函数的模块句柄; 第四个参数指定监视的线程。 如果指定确定的线程,即为线程专用钩子;如果指定为空,即为全局钩子。 其中,全局钩子函数必须包含在DLL(动态链接库)中,而线程专用钩子还可以包含在可执行文件中。 得到控制权的钩子函数在完成对消息的处理后,如果想要该消息继续传递, 那么它必须调用另外一个SDK中的API函数CallNextHookEx来传递它。 钩子函数也可以通过直接返回TRUE来丢弃该消息,并阻止该消息的传递。 两者的本质都是通过指针预加载特定的模块处理特定的消息,但是功能的目的性不同: 函数指针主要是对收到消息进入模块执行特定流程, 钩子函数主要目的是提前截获消息,越过预先定义的消息处理机制,重新定义消息处理模块。 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值