之前的笔记搬运
HOOK(钩子)
钩子的一些概念
1)钩子(Hook),在目标窗口处理函数之前处理它。钩子机制允许应用程序截获处理window消息或特定事件。
2)钩子分为全局钩子和局部钩子;
3)全局钩子一般会把hook的代码和回调函数写在Dll中,供系统注入到进程用来拦截和执行代码;
4)使用32位的Dll只能HOOK到32位的应用程序的消息,但是像鼠标和键盘这样的消息是例外, 64位程序一样可以HOOK消息,只不过不是通过注入DLL的方式;
5)钩子是实现原理,就是在内核中执行指定消息的代码之前先调用我们设置的钩子回调函数;
钩子链表
每一个Hook都有一个与之相关联的指针列表,称之为钩子链表,由系统来维护。被Hook子程调用的回调函数,也就是该钩子的各个处理子程。当与指定的Hook类型关联的消息发生时,系统就把这个消息传递到Hook子程。一些Hook子程可以只监视消息,或者修改消息,或者停止消息的前进,避免这些消息传递到下一个Hook子程或者目的窗口。最近安装的钩子放在链的开始,而最早安装的钩子放在最后,也就是后加入的先获得控制权。
关于HOOK的一些函数
设置钩子
1 | HHOOK SetWindowsHookEx( int idHook, // HOOK类型 |
卸载钩子
1 | BOOL UnhookWindowsHookEx( HHOOK hhk // HOOK句柄); |
零碎知识点
PostMessage 可以向一个窗口的消息队列投递消息
PostThreadMessage 可以向一个线程的消息队列投递消息
有消息的队列的线程才可以使用PostThreadMessage进行通信,一般只有和UI相关的线程才会拥有消息队列,或者可以在一个线程里使用循环GetMessage这个函数,因为在GetMessage这个函数内部会自动为调用线程创建一个消息队列