38.9.5.5 Windows消息处理

很多Windows程序都是事件驱动型程序,这些程序能够根据相应的事件(如“点击图标”、“移动鼠标”和“按键”等)显示对话框和输出声音。

当发生任何类似事件时,Windows会向应用程序发送一条消息表明事件的类型。在收到消息时,应用程序确认事件已经发生并执行处理。

本文中,从Windows中顺序接收消息并将它们分别归入各自的处理(VB中的DoEvents、VC中执行GetMessage ()和DispatchMessage ()的部分)的部分被称为消息泵。

当在VC和VB正常编程时,消息泵隐藏在VC和VB框架内。如果消息泵未正确执行,Windows应用程序会执行一些意外操作。

例如,如果一个程序花了很长时间去处理一条消息而没有返回,那么应用程序在处理时间内就不能从Windows那里接收事件,因此也不能处理事件。

例如,当Windows按照消息1和消息2的顺序发送消息时。消息泵获取消息1并调用消息1的子程序。

一旦返回,它就获取下一条消息(消息2)并调用消息2的子程序。

如果此时需要很长时间处理消息1,消息泵不返回,因此就不能执行消息泵处理2。

在这种情况下,强制执行消息泵操作。(请参考VB中的DoEvents和VC中的GetMessage () 和DispatchMessage ())

Windows应用程序的设计基于正确操作消息泵。为了防止类似示例中的事件,当处理需要太长时间时,WinGP SDK运行函数中的消息泵。