Windows钩子原理及钩子函数

钩子大概原理:

Windows下的应用程序大部分是基于消息模式机制的,一些CUI程序(CUI是基于文本的,它一般不会创建窗口或者进程消息而且不需要GUi)不是基于消息的。Windows下的应用程序都有一个消息过程函数,通过GetMessage()函数在消息队列中得到不同的消息来完成不同的功能。Windows操作系统提供的钩子机制的作用是来截取、监视系统的消息。Windows操作系统提供了很多不同种类的钩子,可以处理不同的消息。

Windows系统提供的钩子按照挂钩的范围分为局部钩子和全局钩子。局部钩子是针对一个线程的,而全局钩子则是针对整个操作系统内基于消息机制的应用程序的。全局钩子需要使用DLL文件,DLL文件里存放了钩子函数的代码。

在操作系统中安装全局钩子以后,只要进程接收到可以发出钩子的消息后,全局钩子的DLL文件就会被操作系统自动或者强行的加载到该进程中。

钩子函数:

HHOOK SetWindowsHookEx( int idHook HOOKPROC lpfn, HINSTANCE hMod, DWORD dwThreadId );

函数的返回值是一个钩子句柄HHOOK。

idHook:表示钩子的类型,下边介绍几个常用的,其余在MSDN中有详细的解释。

lpfn指定HOOK函数的地址。如果dwThread参数被设置为0或者被设置为一个进程中的线程ID,则该回调HOOK函数只能在DLL文件中,如果dwThread为当前进程中的线程ID,则这个回调函数可以在当前进程中也可以在DLL中。

hModHOOK函数所在模块的模块句柄,如果在当前进程中,设置为NULL默认。

dwThreadId需要被挂钩的线程ID号(指定的话为局部钩子),如果设置为0就是在消息机制中的所有线程挂钩(也就是全局钩子),这个参数影响上边两个参数的取值。

BOOL UnhookWindowsHookEx( HHOOK hhk // handle to hook procedure);

移除SetWindowsHookEx()安装的钩子,唯一的参数就是钩子句柄。

在操作系统中,可以反复的使用SetWindowsHookEx()函数来安装钩子,可以安装多个同样类型的钩子,这样就会形成一个钩子链,最后安装的钩子会首先截获消息,所以自己装的钩子会在操作系统之前捕获消息。当自己的钩子对消息处理完毕之后,可以选择屏蔽这个消息不给系统,如果要屏蔽,则直接在钩子函数中返回一个TRUE,如果消息经过你的处理之后还想要继续被系统捕获处理传达到目标进程,则要继续传递给钩子链的下一个,传递的函数如下:

LRESULT CallNextHookEx( HHOOK hhk int nCode, WPARAM wParam LPARAM lParam );

hhk钩子句柄

nCode钩子编码

wParamlParam钩子函数的后两个参数

例如:LRESULT CALLBACK KeyBoardProc(   int code ,  WPARAM wParam,    LPARAM lParam  )

在这个钩子函数处理消息之后调用CallNextHookEx(),CallNextHookEx()函数中的后三个参数就直接把KeyBoardProc()函数中的参数移下来就行了。
                     
   
     

发布了37 篇原创文章 · 获赞 12 · 访问量 9255

猜你喜欢

转载自blog.csdn.net/weixin_43265881/article/details/103774874