剖析 Windows 的消息运行机制
一、引言
随着 Windows 操作系统的不断推广,众多软件开发包都提供有开发基于 Windows 平台应用
软件的功能。虽然这些开发包不尽相同,流行的有 VisualC++、VisualBasic、Delphi、C++
Builder等多种,但由这些不同语言开发的软件有一点却是相同的--都是运行于 Windows操
作平台,都必须接受 Windows的运行机制。作为 Windows操作系统灵魂的消息机制也就必
然为众多用不同语言开发的 Windows 操作系统下运行的应用程序所接受。因此,要编写深
入的 Windows 程序,就必须对 Windows 的运行机制有很好的认识和理解。本文下面将对
Windows 操作系统下的消息运行机制做较为深入的剖析。
二、Windows 事件驱动机制
我们当中不少使用 VC、Delphi 等作为开发语言的程序员是一步步从 DOS 下的 Basic、C++
中走过来的,而且大多在刚开始学习编程时也是先从 DOS 下的编程环境入手的,因此在习
惯了 DOS 下的过程驱动形式的顺序程序设计方法后,往往在向 Windows 下的开发环境转
型的过程中会对 Windows 所采取的事件驱动方式感到无法适应。因为 DOS 和 Windows 这
两种操作系统的运行机制是截然不同的,DOS 下的任何程序都是使用顺序的、过程驱动的
程序设计方法。这种程序都有一个明显的开始、明显的过程以及一个明显的结束,因此通
过程序就能直接控制程序事件或过程的全部顺序。即使是在处理异常时,处理过程也仍然
是顺序的、过程驱动的结构。而 Windows 的驱动方式则是事件驱动的,即程序的流程不是
由事件的顺序来控制,而是由事件的发生来控制,所有的事件是无序的,所为一个程序员
在编写程序时,并不知道用户会先按下哪个按纽,也就不知道程序先触发哪个消息。因此
我们的主要任务就是对正在开发的应用程序要发出的或要接收的消息进行排序和管理。事
件驱动程序设计是密切围绕消息的产生与处理而展开的,一条消息是关于发生的事件的消
息。
三、Windows 的消息循环
Windows 操作系统为每一个正在运行的应用程序保持有一个消息队列。当有事件发生后,
Windows 并不是将这个激发事件直接送给应用程序,而是先将其翻译成一个 Windows 消息,
然后再把这个消息加入到这个应用程序的消息队列中去。应用程序需要通过消息循环来接
收这些消息。在 MFC 中使用了对 WinAPI 进行了很好封装的类库,虽然可以为编程提供一
个面向对象的界面,使 Windows 程序员能够以面象对象的方式进行编程,把那些进行 SDK
编程时最繁琐的部分提供给程序员,使之专注于功能的实现,但是由于引入了很好的封装
特性,使我们不能直接操纵部分核心代码。对于消息的循环和接收也只是通过类似于下面
的消息映射予以很简单的表示:
BEGIN_MESSAGE_MAP(CTEMMSView,CFormView)
//{{AFX_MSG_MAP(CTEMMSView)
ON_WM_LBUTTONDOWN()
ON_COMMAND(ID_OPENDATA,OnOpenData)
ON_WM_TIMER()