以消息为基础,以事件驱动之(message based, event driven)-- 《深入浅出MFC》

本文深入探讨了Windows程序如何依赖外部事件驱动运行,详细讲解了操作系统如何通过USER模块捕捉硬件事件,并将这些事件转化为消息传送给应用程序。文章还介绍了应用程序如何通过系统队列和程序队列接收并处理消息,以及消息在Windows程序中的核心作用。

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

  Windows 程序的进行系依靠外部发生的事件驱动。换句话说,程序不断等待(利用一个while 回路),等待任何可能的输入,然后做判断,然后再做适当的处理

  上述的「输入」是由操作系统捕捉到之后,以消息形式(一种数据结构)进入程序之中。

  操作系统通过USER模块(WINDOWS三大模块之一)捕捉外围设备(如键盘和鼠标)所发生的事件。

  应用程序获得的2类输入:

    由硬件装置所产生的消息(如鼠标移动或键盘被按下),放在系统队列(system queue)

    由Windows 系统或其它Windows 程序传送过来的消息,放在程序队列(application queue)中。

  以应用程序的眼光来看,消息就是消息,来自哪里或放在哪里其实并没有太大区别,反正程序调用GetMessage API 就取得一个消息,程序的生命靠它来推动。

所有的GUI 系统,包括UNIX的X Window 以及OS/2 的Presentation Manager,都像这样,是以消息为基础的事件驱动系统。

  可想而知,每一个Windows 程序都应该有一个回路如下:

 1 MSG msg;
 2 while (GetMessage(&msg, NULL, NULL, NULL)) {
 3 TranslateMessage(&msg);
 4 DispatchMessage(&msg);
 5 }
 6 
 7 // 以上出现的函数都是Windows API 函数消息,也就是上面出现的MSG 结构,其实是Windows 内定的一种资料格式:
 8 /* Queued message structure */
 9 typedef struct tagMSG
10 {
11 HWND hwnd;
12 UINT message; // WM_xxx,例如WM_MOUSEMOVE,WM_SIZE...
13 WPARAM wParam;
14 LPARAM lParam;
15 DWORD time;
16 POINT pt;
17 } MSG;

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值