Windows消息传递机制

本文深入解析Windows消息机制,包括消息的分类(队列消息与非队列消息、系统消息与应用程序消息)、消息传递流程(从输入设备到消息队列再到窗口过程)以及消息的接收与处理方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这里有几个关键词:消息,消息循环,窗口过程。

 

所谓的Windows消息传递机制就类似于生活中的物流公司。当寄件人(例如鼠标、键盘)将包裹(消息)交给物流公司(Windows系统)时,物流公司(Windows系统)会进行整理并且派发(整理&派发主要由消息循环完成),交给相应的快递员(窗口过程)来处理。快递员(窗口过程)拿到包裹(消息)后则有多种方式来处理,如立马交给收件人,等一天交给收件人,转交给其他快递派发,这就需要在窗口过程中利用swich/case来区分。

 

消息循环

当初始化完成后,WinMain主函数就进入消息循环:

While(GetMessage(&msg,...))

{

TranslateMessage(&msg);//转换键盘消息

DispatchMessage(&msg);//分派消息

}

窗口过程

LRESULT CALLBACK WndProc(...)

{

...

switch( msg )

{

case 1:

...

case 2:

...

Default:

...

}

return 0;

}

 

下面以两个问题的方式进行具体概要。

问题1:消息有哪几种分类方法?

(1)      队列消息和非队列消息

队列消息会被送到系统消息队列,然后到线程消息队列。Windows维护一个系统消息队列,每个GUI线程也有一个线程消息队列。其中包括键盘鼠标消息,WM_PAINT、WM_TIMER、WM_QUIT。

这些队列消息以外的消息绝大多数都是非队列消息

Tips:消息队列中放置的消息是以MSG结构的形式存在,MSG包括:窗口句柄、消息标识、消息的两个参数(WPARAM和LPARAM)、消息发送(POST)的时间以及鼠标的位置。此外,可以利用::GetMessage函数和::PeekMessage函数来保存获得的消息信息。

非队列消息直接送给目的窗口过程

(2)       系统消息和应用程序消息

系统消息ID范围 0X8000~0XBFFF

应用程序消ID范围0XC000~0XFFFF

为了应用程序消息的ID唯一性,可以使用::RegisterWindowMessage来得到特定的ID。

 

问题2:消息是如何进行传递、接收、处理的?

Windows应用程序的输入由Windows系统以消息的形式发送给应用程序的窗口,这些窗口通过窗口过程来接收和处理消息,然后把控制返还给Windows。

Tips:非队列消息直接送给目的窗口的窗口过程队列消息由::DispatchMessage派发给目的窗口的窗口过程。窗口过程被调用时接收四个参数:窗口句柄、消息标识、两个32位的消息参数。在窗口过程里,用switch/case分支处理语句来识别和处理消息。

每个GDI应用程序在主窗口创建之后,都会进入消息循环,接受用户输入、解释和处理消息。消息循环消息队列中得到消息,如果不是快捷键消息或对话框消息,就进行消息转换和派发,让目的窗口的窗口过程来处理。当得到消息WM_QUIT,或者::GetMessage出错时,退出消息循环。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值