《Windows核心编程》一书中介绍了一种针对带窗口的Windows应用程序的“DLL注入”的方法——Windows Hook(窗口挂钩)。本系列文章将探讨这种技术的原理和分享我的实验心得。
一、Windows应用程序基本知识
1,“事件驱动,消息响应”
Windows程序是一种“事件驱动”型的程序(相对“非事件驱动型程序”)。要理解Windows程序的运行过程,我们必须先理解Windows操作系统中设计的这套“事件驱动,消息响应”的消息机制。而要理解Windows的消息机制,我们就要先理清“事件”与“消息”的关系。
1)事件(event):
事件是与操作系统底层相关的概念,主要分为两类:硬件事件和系统事件。按下鼠标,按下键盘,按下游戏手柄,插入U盘等都会产生在操作系统中产生事件,这类与硬件相关的事件就是硬件事件;定时器事件,绘图事件(首次调showWindow,或者移动窗口,或者窗口被遮挡后又重新出现等都会触发绘图事件)等这类与硬件没有直接关系的事件就是系统事件(纯抽象性的)。
2)消息(message):
消息是对事件的封装,它相对事件来说是更高级和抽象的概念。举例来说:当鼠标被按下,产生了鼠标按下事件,windows侦测到这一事件的发生,随即发出鼠标被按下的消息到消息队列中,这消息附带了一系列相关的事件信息,比如鼠标哪个键被按了,在哪个窗口被按的,按下点的坐标是多少?如此等等。
此处参考:http://www.cnblogs.com/welen/articles/5115213.html (比较“事件”和“消息”设计的优缺点)
在Qt中,用“信号”(Signal)来表示消息。Qt中的信号与槽(slot)函数,对应于Windows的消息与窗口函数(WndProc)。(不完全等价)
2,消息循环和消息队列
我们可以通过VS新建一个名为“Hello"的默认的“Windows Application”,观察VS自动生成的一些框架代码来理解Windows应用程序的消息机制。主要是看”Hello.cpp“文件。
1)每一个Windows应用程序都会维持一个”消息循环“
在”Hello.cpp“文件的有一个入口函数”wWinMain”,该函数的最后定义并开启了如下一个“消息循环”