钩子(Hook),是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的。当消息到达后,在目标窗口处理函数之前处理它。钩子机制允许应用程序截获处理window消息或特定事件。
钩子实际上是一个处理消息的程序段,通过系统调用,把它挂入系统。每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权。这时钩子函数即可以加工处理(改变)该消息,也可以不作处理而继续传递该消息,还可以强制结束消息的传递。
1.SetWindowsHookEx()把一个应用程序定义的钩子子程安装到钩子链表中。
HHOOK WINAPI SetWindowsHookEx(
__in int idHook, \\钩子类型
__in HOOKPROC lpfn, \\回调函数地址
__in HINSTANCE hMod, \\实例句柄
__in DWORD dwThreadId); \\线程ID
返回值:若此函数执行成功,则返回值就是该挂钩处理过程的句柄;若此函数执行失败,则返回值为NULL(0).若想获得更多错误信息,请调用GetLastError函数.
钩子在使用完之后需要用UnhookWindowsHookEx()
卸载,否则会造成麻烦。释放钩子比较简单,
[1]
()只有一个参数。函数原型如下:UnhookWindowsHookEx(HHOOK hhk;);函数成功返回TRUE,否则返回FALSE。
2.钩子子程是一个应用程序定义的回调函数(CALLBACK Function),不能定义成某个类的成员函数,只能定义为普通的C函数。用以监视系统或某一特定类型的事件,这些事件可以是与某一特定线程关联的,也可以是系统中所有线程的事件。
函数语法:
LRESULT CALLBACK HookProc
(
int nCode,
WPARAM wParam,
LPARAM lParam
);
HookProc是回调函数名。
nCode参数是Hook代码,Hook子程使用这个参数来确定任务。这个参数的值依赖于Hook类型,每一种Hook都有自己的Hook代码特征
字符集。
wParam和lParam参数的值依赖于Hook代码,但是它们的典型值是包含了关于发送或者接收消息的信息。
3.在钩子子程中调用得到控制权的钩子函数在完成对消息的处理后,如果想要该消息继续传递,那么它必须调用另外一个 SDK中的API函数CallNextHookEx来传递它,以执行钩子链表所指的下一个钩子子程。这个函数成功时返回钩子链中下一个钩子过程的返回值, 返回值的类型依赖于钩子的类型。这个函数的原型如下:
LRESULT CallNextHookEx(HHOOK hhk;int nCode;WPARAM wParam;LPARAM lParam;);
hhk为当前钩子的句柄,由SetWindowsHookEx()函数返回。
NCode为传给钩子过程的事件代码。
wParam和lParam 分别是传给钩子子程的wParam值,其具体含义与钩子类型有关。
钩子函数也可以通过直接返回TRUE来丢弃该消息,并阻止该消息的传递。否则的话,其他安装了钩子的应用程序将不会接收到钩子的通知而且还有可能产生不正确的结果。
4.GetModuleHandle()获取一个应用程序或动态链接库的模块句柄.且这个模块必须已经被加载到调用者的进程空间中。
HMODULEGetModuleHandle(
LPCTSTRlpModuleName);lpModuleName 模块名称
返回值如执行成功成功,则返回模块句柄。零表示失败。通过GetLastError获得错误信息
5.在所有的
预处理指令中,#Pragma 指令可能是最复杂的了,它的作用是设定
编译器的状态或者是指示编译器完成一些特定的动作。
用#pragma data_seg建立一个新的
数据段并定义共享数据,其具体格式为:
|
#pragma data_seg("shareddata")
HWNDsharedwnd=NULL;
#pragma data_seg()
#pragma comment
该指令将一个注释记录放入一个对象文件或
可执行文件中
|
1>,#pragma data_seg()一般用于DLL中。 也就是说,在DLL中定义一个共享的,有名字的数据段。最关键的 是:这个数据段中的全局变量可以被多个进程共享。否则多个进程之间无法共享DLL中 的全局变量。
2>,共享数据必须初始化,否则微软编译器会把没有初始 化的数据放到.BSS段中,从而导致多个进程之间的共享行为失败。
6.#pragma comment(linker,"/section:MySec,RWS")
这里将指令类型指定为linker,表明该行代码用来指定连接选项。而字符串"/section:MySec,RWS"表明将MySec这个节设置为读(R)写(W)共享(S)类型。