当前位置:首页 > 芯闻号 > 充电吧
[导读]Windows系统是一个消息驱动的操作系统,消息是应用程序与操作系统交互的手段。消息的产生来源于系统事件和用户事件,Windows用消息来调入和关闭应用程序。例如在关机操作中,Windows给所有正在

Windows系统是一个消息驱动的操作系统,消息是应用程序与操作系统交互的手段。消息的产生来源于系统事件和用户事件,Windows用消息来调入和关闭应用程序。例如在关机操作中,Windows给所有正在运行的应用程序发出一个关机的消息,通知它们退出内存,此时,应用程序用响应消息的方法来回应。MFC通过封装的方式提供对大部分消息处理的接口。本章将围绕消息分类、发送、接收、处理以及重定向等内容展开讨论。
1.1
消息分类从不同的角度,有如下几种分类方式。

    从消息的发送途径上看,可以分为队列消息和非队列消息。

    从消息的来源来看,可以分为系统消息和自定义消息。

    从对消息的处理上看,可以分为窗口消息、命令消息和控件通知。

本节主要分类介绍各种消息的特点。在介绍消息的分类之前,先了解一下消息的结构。
1.1.1
消息结构消息是系统或用户定义的一些UINT常量值,在Windows中,用一个结构类型表示消息的UINT常量值和与该消息相关的其他信息,它的具体定义如下:
typedef struct tagMSG {// 消息结构
    HWND   hwnd;      
    UINT   message;
    WPARAM wParam;
    LPARAM lParam;
    DWORD  time;
    POINT  pt;
} MSG;
该结构共有6个成员,其各个成员含义具体如下。

    hwnd成员:该成员是一个句柄,它标识了将要接收此消息的窗口。

    message成员:该成员是消息号,为无符号整形UINT,在系统或者应用中是一个预定义的常量,它是消息的标识符。

    wParam成员:该成员在MFC中一般作为常用的消息参数,它携带message消息的附加信息,依据message的具体值有所不同。

    lParam成员:该成员和wParam成员的作用类似,在MFC中一般作为常用的消息参数,它携带message消息的附加信息,依据message的具体值有所不同。

    time成员:该成员是一个时间值,标识消息被发送时的时间。

    pt成员:该成员指定了消息被发送时光标的位置,单位是屏幕坐标。

 

说明 在基于MFC的应用开发中,一般并不需要所有的成员参数,正如文中所说的,一般只用wParam和lParam就基本满足需要了。
1.1.2
队列消息和非队列消息Windows为当前运行的每个Windows程序维护一个“消息队列”。当通过鼠标或者键盘发生输入事件后,Windows将事件转换为一个“消息”,并将消息放入程序的消息队列中。而队列消息是指由Windows放入程序的消息队列中的消息,在程序消息循环中,队列消息被重新传回并分配给窗口过程。非队列消息是指在Windows调用窗口时直接传送给窗口过程的消息。也就是说,队列消息被“发送”给消息队列,而非队列消息则“发送”给窗口过程。由此可以发现,窗口过程是窗口消息的处理场所。
1.队列消息队列消息大都是用户输入的结果,如击键(WM_KEYDOWN和WM_KEYUP消息)、字符(WM_CHAR)消息、移动鼠标(WM_MOUSEMOVE消息)以及单击鼠标(WM_ LBUTTONDOWN和WM_LBUTTONUP等消息)等。队列消息还包括时钟消息(WM_ TIMER)、重画消息(WM_PAINT)和退出消息(WM_QUIT)等。
2.非队列消息大部分消息都是非队列消息。此类消息大部分来自特定的Windows函数,如当调用UpdateWindow时,Windows将给调用此函数窗口的窗口过程发送WM_PAINT;当调用DestroyWindow时,Windows将给调用此函数窗口的窗口过程发送WM_DESTROY等。
1.1.3
系统消息和自定义消息
Windows消息是预定义的一些UINT常量值,它对系统本身用到的消息进行了定义,为了实现额外的消息,系统为开发人员预留了消息定义的接口,这样,当需要使用系统以外的消息时,可以使用该接口进行定义自己的消息。
系统消息ID的范围是从0~WM_USER-1,或0X8000~0XBFFF;应用程序消息从WM_USER(0XC000)~0XFFFF,或0XC000~0XFFFF;WM_USER~0XFFFF范围的消息由应用程序自己使用;0XC000~0XFFFF范围的消息用来和其他应用程序通信,为了保证ID的唯一性,使用::RegisterWindowMessage来获取该范围的消息ID。

1.1.4
窗口消息窗口消息(Window Message)是由操作系统和控制其他窗口的窗口所使用的消息,它一般与窗口的内部运作有关,如创建窗口、绘制窗口和销毁窗口等。通常,消息是从系统发送到窗口,或从窗口发送到窗口。此类消息的参数Message、wParam和lParam的格式如表1所示。

表1                                                              窗口消息参数

 

 消息

 参数wParam

 参数lParam

 WM_XXX

 定义的命令

定义的命令 

 

 

1.1.5

命令消息命令消息是一种特殊的窗口消息,它从一个窗口发送到另一个窗口,以处理来自用户的请求。当用户单击一个菜单项、工具栏或者使用加速键时,将会产生命令消息,并被发送到能处理该请求的类对象。此类消息的参数Message、wParam和lParam的格式如表6-2所示。
表2                                                              命令消息参数

消息

参数wParam

参数lParam

WM_COMMAND

0

CommandID

0

 

其中wParam的高字为0,低字为CommandID,这个命令ID要么是选中菜单项的ID,要么是被单击的工具栏按钮。需要注意的是,低字CommandID不能大于一个字长,如果它大于一个字长,则系统就只用0来填充高位字。某些控件通知也用WM_COMMAND消息,区别两种消息的唯一方法是lParam是否为NULL。

 

 

1.1.6  控件通知
控件通知类似于命令消息,当用户与控件窗口交互时,这一类消息就从控件窗口发送到其主窗口。但是,这种消息的目的并不在于处理用户命令,而是为了让主窗口能够更新控件的状态,如加载并显示更多的数据。通常,在发生某些重要事件时,该消息由控件窗口发送到父窗口,它为父窗口进一步控制子窗口提供了机会。

控件通知经历了一个演变过程,它所使用的消息形式有窗口消息形式、命令消息形式及WM_NOTIFY消息形式等3种形式,下面分别予以介绍。

1.窗口消息形式
这种形式的控件通知是窗口消息的子集,因此,它的消息参数具有和窗口消息一致的格式,这里不再列出。

2.命令消息形式
这种形式的控件通知使用WM_COMMAND消息,虽然它与命令消息共享参数,但是,它的消息参数有了另外的含义。它的消息参数Message、wParam和lParam的格式如表6-3所示。

表6-3                                                              命令消息参数

消息

参数wParam

参数lParam

WM_COMMAND

XN_XXX

控件ID

窗口句柄

     
其中lParam用来标识是命令消息还是控件通知。如果是命令消息,则lParam为NULL,而如果是控件通知,则lParam值是一个句柄,用来标识发出该通知的控件。
而wParam中的高字的XN_XXX值随发出通知控件的不同而变化。例如,XN_XXX值为EN_CHANGE,告诉父窗口显示在编辑框控件中的文本已发生变化。而其低字则标识了发出该通知的控件,即控件ID。

3.WM_NOTIFY消息形式
这种形式的控件通知使用WM_NOTIFY消息。老版本的Windows控件一般都使用命令消息形式发送通知。然而,标准的32位wParam和lParam消息参数所能提供的信息对于通用控件的需求来说是不够的,因此,通过引入WM_NOTIFY这种新的消息来解决“带宽”的问题。
在这种形式的消息所携带的参数中,wParam标识控件ID,而lParam是一个指向结构的指针,该结构可以是NMHDR或者是包含NMHDR的更大结构,但是后者以NMHDR作为它的第一个成员。需要注意的是,既然NMHDR是某个更大结构的第一个成员,那么指向这个结构的指针就可以用作NMHDR*类型或者指向那个更大结构的指针,当然,这取决于怎么去映射它。

说明
通常情况下,lParam指向一个比NMHDR更大的结构,因此,在使用过程中,通常需要进行映射。不过当用类向导对WM_NOTIFY消息进行响应时,它会自动设为一个合适的指针。仅有少数的通知,例如通用通知(通知消息以NM_打头)和工具提示控件的TTN_SHOW和TTN_POP通知才是实际使用NMHDR结构。所以,通常也将NMHDR称作通知消息头(Notification Message Header,具体定义参见MSDN)。标准Windows控件如编辑控件、组合框控件、列表框控件、按钮控件、滚动条控件以及静态控件等并不发送WM_NOTIFY消息。  

第一类消息(消息ID从0到WM_USER–1)是系统消息;

第二类消息(消息ID从WM_USER到0x7FFF)是供窗口类内部使用的自定义消息;

第三类消息(消息ID从0x8000到0xBFFF)是供应用程序内部使用的自定义消息;

第四类消息(消息ID从0xC000到0xFFFF)是供应用程序之间使用的自定义消息;

第五类消息(消息ID大于0xFFFF)是目前保留起来的供将来使用的消息,无定义;

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭