所谓回调函数,一般就是把函数的地址作为参数传进去,让调用的函数在内部可以调用这个函数。 例子: 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来丢弃该消息,并阻止该消息的传递。 两者的本质都是通过指针预加载特定的模块处理特定的消息,但是功能的目的性不同: 函数指针主要是对收到消息进入模块执行特定流程, 钩子函数主要目的是提前截获消息,越过预先定义的消息处理机制,重新定义消息处理模块。
回调函数和钩子函数
最新推荐文章于 2024-09-04 21:43:11 发布