欢迎来到朵拉利品网
知识中心
资讯
  • 资讯
  • 产品
  • 供应商
您的位置: 朵拉利品网 >  知识中心 > 钩子函数 请教高手钩子函数的用法和作用
钩子函数 请教高手钩子函数的用法和作用
2020-05-06 10:26:10 来源:朵拉利品网

1, 请教高手钩子函数的用法和作用



Windows的钩子函数分两种,一种是全局的,一种是线程的。全局的钩子函数可以捕获任何应用程序的消息,但必须是标准的DLL才能实现,VB做不了。VB可以实现线程的,就是当前应用程序的消息,这对鼠标消息的捕636f70797a6431333335346166捉有影响。
SetWindowsHookEx定义如下:
Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long
idHook是钩子类型,如WH_KEYBOARD捕捉键盘消息,而WH_MOUSE捕捉鼠标消息。hmod用于全局钩子,VB要实现钩子,必须设为0。dwThreadId用于线程钩子VB中可以设置为App.ThreadID。lpfn为钩子函数,在VB中可以使用AddressOf获得钩子函数的地址。这个函数因为钩子类型不同而有所不同。如键盘钩子为:
Public Function KeyboardProc(ByVal nCode As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long
如果Code不为0,钩子函数必须调用CallNextHookEx,将消息传递给下面的钩子。wParam和lParam不是按键。

2, 回调函数 钩子函数 有什么区别



问得不清楚,所以不懂怎么回答这个区别。
所谓回调函数,一般就是把函数的地址作为参数传进去,让调用的函数在内部可以调用这个函数。
例子:
void CALLBACK fun(){...} 这是一个函数,回调函数
void AAA(int a, Fun* p); 这是一个普通函数,但第二个参数是fun
AAA(5, fun);
钩子函数,严格算起来,也算是回调函数的一种。但钩子函数是针对的截取的,当你使用了钩子之后,每当触发到相对应的消息,系统就会先“执行你写的回调函数”。
即原本是:系统-->;目标函数
使用钩子就变成:系统-->;你写的回调函数-->;目标函数
大概原理就是这样子。就不知道你对函数与钩子的了解水平如何了

3, 钩子函数的原理c/c++



我的个人理解:
钩子函数其实就是函数指针,系统或软件定义好一些钩子,而你来把这些钩子挂接起来!说白了就是有些动作系统需要针对不同的情况做不同的处理,此时就需要定义一个钩子。具体的操作由用户挂上的钩子函数实现.
比如:
#include "stdio.h"
void (*g_say_func)(void);
void regist_say( void (*pfunc)(void ) )
{
g_say_func = pfunc;
}
void humen_say()
{
printf("hello world!!! ");
}
void dog_say()
{
printf("wo wo !!! ");
}
void cat_say()
{
printf("miao miao!!!");
}
void say_hello()
{
g_say_func();
}
void main()
{
regist_say(dog_say); //注册钩子函数
say_hello();
}
以上纯粹是个人理解!

名词解释


钩子

钩子,草本植物。钩子为蔷薇科悬钩子属的植物。分布於朝鲜、北欧、俄罗斯、蒙古以及中国大陆的吉林、辽宁、黑龙江等地,生长於海拔1,200米的地区,多生於侧坡、林下以及沟旁,尚未由人工引种栽培。

Long

long关键字表示一种整型,该类型根据下表显示的大小和范围存储值。类型 范围 大小 .NETFramework类型 long -2,147,483,648 to 2,147,483,647 有符号 32位整数 所占4个字节(Byte) long long -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 有符号 64位整数 System. Int32 所占8个字节(Byte)