“消息”是windows运行机制中一个基本而又重要的概念。消息是一个报告事件发生的通知,消息驱动是围绕消息的产生与处理展开的,并依靠
消息循环机制来实现。
从程序设计的观点看,某条消息可被视为某个事件的发生,比如点击鼠标。事件即可以由用户引发,也可以由应用程序产生,当然Windows本身也能发出消息。Windows应用程序的消息来源有4种:输入消息,控制消息,
系统消息,用户消息。
Windows是一个
多任务操作系统,所以没有哪一个程序能够独占系统的资源,资源都是由Windows统一管理的。那么某个程序是如何获得用户的信息呢?事实上,Windows在时刻监视着用户的每个举动,并分析用户的动作与哪一个程序相关,然后将动作以消息的形式发送给当前的应用程序。相反,应用程序也在时时等着消息的到来,一旦发现它的
消息队列中有未处理的信息,就获取并分析该消息,并根据消息所包含的内容采取适当的动作来响应。这里我们引出另一个概念“消息驱动”。比如当你单击file
菜单的时候,首先这个动作被windows所捕获,而不是应用程序。经分析windows知道该动作该由哪个应用程序处理,然后windows就发送WM_COMMAND消息给该应用程序,它告诉应用程序,你单击了file
菜单。应用程序得知这一消息后,便采取相应的动作来响应它,进行“消息处理”。Windows为每个线程维护了相应的
消息队列,应用程序的任务就是不停地从特定的
消息队列中获取消息、分析消息并
处理消息,直到消息(WM_QUIT)为止。这个过程的程序结构称为“
消息循环”。
寄送一个消息时,系统把消息发送到拥有该窗口的应用程序消息队列中。
消息队列是
系统定义的一个内存块,用于临时存储消息,或是把消息直接发给
窗口过程。每个窗口维护自己的
消息队列,从中取出消息,利用
窗口函数进行处理。一有空闲,应用程序就搜索
消息队列,并在消息队列中处理消息,即从队列中删除他们。调用函数发送消息后就立即返回,但结果只是表示消息寄送成功与否,而不表示被调用窗口进程的结果。通常鼠标和键盘消息是寄送的。
Windows程序在处理消息时使用了“
回调函数”的特殊函数。这个函数由应用程序定义,但并不由应用程序来调用,而是供操作系统或者其子系统来调用的。这种调用通常在某一事件发生,或者在窗口或字体被枚举时发生。Windows向程序员所能发送的消息多达百种,但是,对于一般的应用程序来说,只是其中的一部分有意义。
KERNEL:支持与操作系统密切相关的功能。如进程加载,
系统调用USER:为所有的用户界面对象提供支持,它用于接收和管理所有输入消息、
系统消息,并把他们发给相应的窗口的
消息队列。
上述GDI、KERNEL和USESR模块中的库函数可被应用程序调用,也可被其他
程序模块调用。Windows把包含库函数的模块称为EXPORT,在WINDOWS提供的一种新的EXE文件中有一个入口表用于指明模块内每个输出函数的地址。
从应用程序方面,用到的
库函数被认为是IMPORT函数。应用程序对一个入口函数发出的远程调用可用不同的重定位表来确定。几乎所有的应用程序都至少包含一个入口库
函数或者称为被外部调用的函数。该windows库函数一般来自某个程序模块,用于从WINDOWS接收消息,该函数的使用标志必须是EXPORT,这才能使WINDOWS允许它被一个外部模块正常调用。