Windows消息处理机制

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

windows消息处理机制

消息,就是指Windows发出的一个通知,告诉应用程序某个事情发生了。例如,单击鼠标、改变窗口尺寸、按下键盘上的一个键都会使Windows发送一个消息给应用程序。消息本身是作为一个记录传递给应用程序的,这个记录中包含了消息的类型以及其他信息。例如,

对于单击鼠标所产生的消息来说,这个记录中包含了单击鼠标时的坐标。这个记录类型叫做TMsg,它

在Windows单元中是这样声明的:

type

TMsg = packed record

hwnd: HWND; / /窗口句柄

message: UINT; / /消息常量标识符

wParam: WPARAM ; // 32位消息的特定附加信息

lParam: LPARAM ; // 32位消息的特定附加信息

time: DWORD; / /消息创建时的时间

pt: TPoint; / /消息创建时的鼠标位置

e n d ;

消息中有什么?

是否觉得一个消息记录中的信息像希腊语一样?如果是这样,那么看一看下面的解释:

hwnd 32位的窗口句柄。窗口可以是任何类型的屏幕对象,因为Win32能够维护大多数可

视对象的句柄(窗口、对话框、按钮、编辑框等)。

message 用于区别其他消息的常量值,这些常量可以是Windows单元中预定义的常量,也可以是自定义的常量。

wParam 通常是一个与消息有关的常量值,也可能是窗口或控件的句柄。

lParam 通常是一个指向内存中数据的指针。由于WParam、lParam和Pointer 都是32位的,因此,它们之间可以相互转换。

Windows的消息系统是由3个部分组成的:

• 消息队列。Windows能够为所有的应用程序维护一个消息队列。应用程序必须从消息队列中获取

消息,然后分派给某个窗口。

• 消息循环。通过这个循环机制应用程序从消息队列中检索消息,再把它分派给适当的窗口,然

后继续从消息队列中检索下一条消息,再分派给适当的窗口,依次进行。

• 窗口过程。每个窗口都有一个窗口过程来接收传递给窗口的消息,它的任务就是获取消息然后

响应它。窗口过程是一个回调函数;处理了一个消息后,它通常要返回一个值给Wi ndows。

注意回调函数是程序中的一种函数,它是由Windows或外部模块调用的。

一个消息从产生到被一个窗口响应,其中有5个步骤:

1) 系统中发生了某个事件。

2) Windows把这个事件翻译为消息,然后把它放到消息队列中。

3) 应用程序从消息队列中接收到这个消息,把它存放在TMsg记录中。

4) 应用程序把消息传递给一个适当的窗口的窗口过程。

5) 窗口过程响应这个消息并进行处理。

步骤3和4构成了应用程序的消息循环。消息循环往往是Windows应用程序的核心,因为消息循环

使一个应用程序能够响应外部的事件。消息循环的任务就是从消息队列中检索消息,然后把消息传递给适当的窗口。如果消息队列中没有消息,Windows就允许其他应用程序处理它们的消息。

Windows操作系统最大的特点就是其图形化的操作界面,其图形化界面是建立在其消息处理机制这个基础之上的。如果不理解Windows消息处理机制,肯定无法深入的理解Windows编程。可惜很多程序员对Windows消息只是略有所闻,对其使用知之甚少,更不了解其内部实现原理,本文试着一步一步向大家披露我理解的Wi ndows消息机制。可以说,掌握了这一部分知识,就是掌握了Windows编程中的神兵利器,灵活运用它,将会极大的提高我们的编程能力。

[编辑本段]

一、消息概述

Windows窗体是怎样展现在屏幕上的呢?众所周知,是通过API绘制实现的。Windows操作系统提供了一系列的API函数来实现界面的绘制功能,例如:

2 DrawText绘制文字

2 DrawEdge绘制边框

2 DrawIcon绘制图标

2 BitBlt 绘制位图

2 Rectangle绘制矩形

2 …

再复杂的程序界面都是通过这个函数来实现的。

那什么时候调用这些函数呢?显然我们需要一个控制中心,用来进行“发号施令”,我们还需要一个命令传达机制,将命令即时的传达到目的地。这个控制中心,就是一个动力源,就像一颗心脏,源源不断地将血液送往各处。这个命令传达机制就是Wi ndows消息机制,Windows消息就好比是身体中的血液,它是命令传达的使者。

Windows消息控制中心一般是三层结构,其顶端就是Windows内核。Windows 内核维护着一个消息队列,第二级控制中心从这个消息队列中获取属于自己管辖的消息,后做出处理,有些消息直接处理掉,有些还要发送给下一级窗体(Window)或控件

(Control)。第二级控制中心一般是各Windows应用程序的Application对象。第三级控制中心就是Windows窗体对象,每一个窗体都有一个默认的窗体过程,这个过程负责处理各种接收到的消息。如下图所示:

说明图

(注:windows指windows操作系统;窗口:即windows窗口;窗体:包括窗口,以及有句柄的控件;control指控件,控件本身也可能是一个window,也可能不是;Application即应用程序,应用程序也可能不会用到Windows消息机制,这里我们专门讨论有消息循环的应用程序)

消息是以固定的结构传送给应用程序的,结构如下:

Public Type MSG

hwnd As Long

message As Long

wParam As Long

lParam As Long

time As Long

pt As POINTAPI

End Type

其中hwnd是窗体的句柄,message是一个消息常量,用来表示消息的类型,w Param和lParam都是32位的附加信息,具体表示什么内容,要视消息的类型而定,time是消息发送的时间,pt是消息发送时鼠标所在的位置。

Windows操作系统中包括以下几种消息:

1、标准Windows消息:

这种消息以WM_打头。

2、通知消息

通知消息是针对标准Windows控件的消息。这些控个包括:按钮(Button)、组合框(ComboBox)、编辑框(TextBox)、列表框(ListBox)、ListView控件、Treeview 控件、工具条(Toolbar)、菜单(Menu)等。每种消息以不同的字符串打头。

3、自定义消息

编程人员还可以自定义消息。

二、关于Windows句柄

相关文档
最新文档