发信人: 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]
  | 
 
 
 |