精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>编程开发>>C/C++>>C、C++语言基础>>有关消息的概念

主题:有关消息的概念
发信人: skyice()
整理人: skyice(2000-03-17 23:03:18), 站内信件
消息
    Windows系统是以消息的形式把输入传给窗口过程,消息是由 Windows
系统或应用程序产生的,Windows 系统对每一个输入事件都要产生消息。应
用程序可通过产生消息指导它自己的窗口来完成某一任务,或与其它应用程
序的窗口进行通信。
    Windows 系统把消息发给窗口过程,窗口过程有四个参数:窗口句柄、
消息标识以及两个消息参数的 32 位值。窗口句柄决定消息将发送到那一个
窗口,Windows 系统则用它来确定向那一个窗口过程发送消息。消息标识是
一个命名的常量,由它来标明消息的目的。消息参数指定窗口过程在处理消
息时所用的数据或数据的位置,消息的意图及数值取决于消息本身。

消息路由
    Windows 系统用两种方式向窗口过程发送消息:
    (1)将消息投递到一个先进先出的消息队列中,其中消息队列是指系统定
义的内存块,用于临时存储消息;
    (2)将消息直接发给窗口过程。
    投递到消息队列中的消息称为排队消息,它们主要是用户通过鼠标或键
盘输入的结果。直接发送到窗口过程的其它消息称为非排队消息。
    1.排队消息
    Windows 系统在同一时间可显示多个窗口,要发送鼠标和键盘的输入到
相应窗口,Windows 系统就要用到消息队列,它要管理一个系统消息队列和
任意数目的线程消息队列,每一个队列对应于一个线程。
    不管何时,只要用户移动鼠标或敲击键盘,鼠标或键盘的设备驱动器都
要把输入转换成消息,并把它们放到系统消息队列中去。Windows 从系统队
列中每次移走一条消息,确定目的窗口,再把它们投递到创建目的窗口的线
程的消息队列中,线程消息队列接收所有由该线程创建的窗口的鼠标和键盘
消息。线程从它的队列中移走消息并指导 Windows 系统将它们发送到相应
的窗口过程进行处理。
    系统向线程消息队列投递消息是通过填充一个 MSG 结构,再把它复制
到消息队列中,MSG结构中的信息包括接收消息的窗口句柄、消息标识、两个
 32 位的消息参数、消息时间以及鼠标的位置。线程可把消息投递到它自己
的消息队列中或是通过 PostMessage 和 PostThreadMessage 函数将消息
投递到其它线程的消息队列中。
    应用程序可通过 GetMessage 函数从它的队列中移走一条消息,也可
通过 PeekMessage 函数来检查队列中的某一个消息但并不移走它。当一条
消息从它的队列中移走后,应用程序可通过 DispatchMessage 函数指导 
Windows 系统把该消息发送到窗口过程进行处理。
    2.非排队消息
    非排队消息是直接发送到目标窗口过程的消息,而不通过系统消息队列
和线程消息队列。Windows 系统一般通过发送非排队消息把影响某窗口的事
件通知窗口。
    应用程序是通过调用 SendMessage、SendNotifyMessage、SendDlg-
ItemMessage 函数来发送该类消息的。

投递和发送消息
    跟系统一样,任何应用程序都投递和发送消息,应用程序投递一条消息
是通过把它复制到消息队列中,发送消息则是通过把消息数据作为窗口过程
的参数。要投递和发送消息,应用程序要用到 PostMessage、SendMessage
函数。
    应用程序一般是通过发送一条消息通知某个窗口去完成一个任务。Pos-
tMessage 为消息创建一个 MSG 结构并把消息拷贝到消息队列中,最后由
应用程序的消息环来检取这条消息,再把它发送到相应的窗口过程。在调用 
PostMessage 函数时,如果应用程序提供 NULL 窗口句柄,这条消息就被
投递到与当前线程相应的队列中。
    应用程序一般是通过发送一条消息通知窗口过程立即完成某项任务,Se-
ndMessage 函数将消息发送到与给定窗口相应的窗口过程,该函数要等待窗
口过程完成处理并返回消息的结果。父窗口和子窗口之间也是通过发送消息
来进行相互间的通信。
    通过 IsSendMessage 函数,窗口过程能够确定它所处理的消息是从另
一个线程发来的,这种功能在需要依据消息源进行消息处理时很有用。

消息种类
    Windows 的消息可以分为系统消息和用户自定义消息。
    1.系统消息
    系统使用系统定义的消息来控制应用程序的操作,并给应用程序提供输
入或其它信息进行处理。系统在与应用程序进行通信时是通过发送或投递系
统消息完成的,应用程序也能发送或投递系统消息。每条系统消息都有一个
唯一的消息标识,对应于一个符号常量,它表明了消息的目的。Windows 系
统保留用于系统定义的消息的标识值的范围从 0X0000 到 0X03FF(等于 
WM_USER-1)和 0X8000 到 0XBFFF。
    2.用户自定义消息
    应用程序可创建用在它自己的窗口中的消息,或是与其它进程中的窗口
进行通信的消息。如果应用程序创建了它自己的消息,接收它们的窗口过程
必须能够对消息进行翻译,并提供相应的处理。从 0X0400(WM_USER的值)
到 0X7FFF 之间的值是可用于应用程序定义的用于它自己的消息标识,而从
0XC000 到 0XFFFF 之间的值是应用程序为了与其它应用程序中的窗口进行
通信所定义的消息标识。应用程序使用 RegisterWindowMessage 函数注册
一条消息时,Windows 系统返回的消息标识就在 0XC000 到 0XFFFF 之间。

消息过滤
    应用程序可使用 GetMessage 或 PeekMessage 函数来指定一个消息过
滤器,从消息队列中检取指定的消息,这是一个消息标识的范围、一个窗口
句柄或两者都有。如果某个应用程序必须检索消息队列中排在后面的消息,
则消息过滤器十分有用。

--
欢迎您到C语言版来!
欢迎光临BBS系统版!

※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.99.90.249]

[关闭][返回]