windows消息的处理过程 消息队列
admin
2024-01-31 13:24:48

消息的流转过程
1.创建消息
PostMessage、SendMessage(消息直接投递到窗口处理函数)
2.消息推送到消息队列中
系统消息队列、应用软件消息队列
收到的消息先进系统消息队列中,然后转发(根据窗口的实例句柄MSG.hwnd–>hInstance)消息到每个进程中的消息队列中
3.获取消息
去进程的消息队列中抓取消息
PeekMessage、GetMessage
4.翻译消息
TranslateMessage
5.转发消息
DispatchMessage
6.消息处理函数
用户自定义消息处理函数WndProc、操作系统默认处理函数DefWindowProc

消息队列
1.消息队列概念
消息队列是用于存放消息的队列;
消息在队列中先入先出;
所有的窗口都具有消息队列;
程序可以从队列中获取消息。(GetMessage可以抓取消息,PeekMessage查询消息)
2.消息队列的分类
系统消息队列-由系统维护的消息队列。
存放系统生产的消息,例如鼠标、键盘等。
程序消息队列-属于每一个应用程序(线程)的消息队列。由应用程序(线程)维护。
3.消息和消息队列的关系
消息和消息队列的关系
a.当鼠标、键盘产生消息时,会将消息存放到系统消息队列
b.系统会根据存放的消息,找到对应的消息队列。
c.将消息投递到程序队列中
根据消息和消息队列之前使用关系,将消息分成两类:
队列消息-消息的发送和获取,都是通过消息对列完成。
消息发送后,首先放入系统队列,然后转发到应用程序的队列。然后通过消息循环,从队列当中获取。
GetMessage-从消息队列中获取消息
PostMessage-将消息投递到消息队列中
常见的队列消息:WM_PAINT、键盘、鼠标、定时器
非队列消息-消息的发送和获取,是直接调用消息的窗口处理完成。
消息发送时,首先查找消息接口窗口的窗口处理函数,直接调用处理函数,完成消息处理。
SendMessage-直接将消息发给窗口处理函数,并等候处理结果。
常见的非队列消息:WM_CREATE、WM_SIZE等。
分类的根据本质是消息是否将消息送入对列。

深入理解GetMessage
a.在程序(线程)消息队列查找消息,如果队列有消息,检查消息是否满足指定条件(hwnd,ID范围),不满足条件就不会取出消息,否则从队列取出消息。
b.如果程序(线程)消息队列没有消息,向系统消息队列获取属于本程序消息。如果系统队列的当前消息属于本程序,系统会将消息转发到程序消息队列中。
c.如果消息队列也没有消息,检查当前进程的所有串口的需要重新绘制的区域,如果发现有需要绘制的区域,产道理WM_PAINT消息,取得消息返回处理。
d.如果没有重新绘制区域,检查定时器如果有到时的定时器,产生WM_TIMER,返回处理执行。
e.如果没有到时的定时器,整理程序的资源、内存等等。
f.GetMessage会继续等候下一条消息(阻塞),Peekmessage会返回FALSE,交出程序的控制权。
注意:GetMessage如果获得到的是WM_QUIT,则函数返回FALSE。

相关内容

热门资讯

广东卷土重来全队猛,胡明轩为何... CBA联赛战罢五轮,十一冠王广东宏远大有卷土重来之势。目前和北京北汽同为五战全胜的球队。也是目前唯二...
虾塘底质差如何解决和管理 一、在养虾业中,众多养殖户常常面临诸多挑战,其中饲料选择与水质监管虽备受关注,然而,有一个至关重要的...
员工转正定级的自我鉴定范文 卫...   从20xx年底参加工作至今已将近一年的时间,经过这一年的努力工作和不断学习,不管是失败的教训还是...
500字自我鉴定范文 500字...   大学,人生重要的一站。即将离开我亲爱的师友和同窗,充满依恋与不舍。现对本人的大学生活鉴定如下: ...
最新或2023(历届)个人工作...   自今年6月份调入****物业管理处以来,我努力适应新的工作环境和工作岗位,虚心学习,埋头工作,履...