Windows 消息循环 GetMessage() PeekMessage()

【MFC】PeekMessage() 与GetMessage() 消息函数 01、目录 目录01、目录02、简言03、PeekMessage() Function3.1 语法(Syntax)3.2 参数(Parameters)3.3 返回值(Return value)04、GetMessage() Function4.1 语法(Syntax)4.2 参数(Parameters)4.3 返回值(Return value)05、示例助教06、总结 02、简言 想必了解过MFC(windows程序)的都知道,windows的程序全是由消息驱动的。不敢干什么,都是通过各种各样的消息来做一些 阅读详情
  1. GetMessage()函数的消息循环的汇编代码
    .while	TRUE
    			invoke	GetMessage,addr @stMsg,NULL,0,0
    			.break	.if eax	== 0
    			invoke	TranslateMessage,addr @stMsg
    			invoke	DispatchMessage,addr @stMsg
    		.endw
    		ret
    
    解读:
    1. 调用 GetMessage 函数,函数中都要用到一个MSG结构体,那是用来存储 消息信息 的。
    2. Windows结构体的定义都放在 windows.inc 这个文件中,我们可以从中查到 MSG的定义
      	MSG STRUCT
      	  hwnd      DWORD      ?
      	  message   DWORD      ?
      	  wParam    DWORD      ?
      	  lParam    DWORD      ?
      	  time      DWORD      ?
      	  pt        POINT      <>
      	MSG ENDS
      
      参数介绍:
      1. hwnd - 消息发送的窗口句柄。
      2. message - 消息标识符,表示何种消息。
      3. wParam - 消息参数之一。
      4. lParam - 消息参数之二。
      5. time - 消息放入消息队列的时间。
      6. pt - POINT数据结构,表示消息放入消息队列时的鼠标坐标。
    3. 理解:
      1. GetMessage()函数相当于开始拿着一个空的MSG,然后去消息队列中获取。在这里插入图片描述
      2. 当发现MSG中的消息是WM_QUIT时,则GetMessage()返回值为0,返回值保存在寄存器eax中,所以,此时,程序就会结束消息循环,也就是退出窗口过程。
      3. Windows窗口程序的本质就是 消息循环,对于 所有函数信息的处理,都遵循这一套模板,哪怕windows内置的函数也是这样的。
  2. PeekMessage()的消息循环:
    1. Windows是一个抢占式的操作系统,任务每20ms切换一次。
    2. 对于GetMessage()来讲,轮到自己的20ms时,它会读取并处理消息,但消息队列里没有属于它一份的消息,它就会停留在GetMessage函数内部,当Windows发现它这样时,Windows认为该窗口没有要处理的,此时就会剥夺它的时间,所以,GetMessage函数是程序空闲的时候主动将控制权交给Windows的一种方式。
    3. PeekMessage()与GetMessage()类似,区别时在没有消息时,它不会像GetMessage()那样在内部停留,而是直接返回,并且设置eax为0,所以,在0时,程序会检查是否是WM_QUIT。
    4. 所以,PeekMessage在没有收到消息的时候会一直循环检测,从而Windows不会剥夺该任务的时间片,也就是说,20ns的时间片内,就算没有消息,它也会一直在循环检测不会吧控制权交还给Windows程序。
windows下GetMessage和PeekMessage函数区别 摘要:本文详细解析了Windows API中的GetMessage和PeekMessage函数,聚焦两大核心主题:1. 函数区别:GetMessage在消息队列为空时会阻塞线程,适用于标准消息循环;PeekMessage则立即返回,支持非阻塞处理,适合实时应用。2. 消息过滤机制:通过wMsgFilterMin/Max参数可精确控制消息获取范围,PeekMessage独有的wRemoveMsg参数可控制是否移除消息。文章还系统分类了常见WM_消息常量(如键盘/鼠标事件、窗口生命周期等),并给出典型应用场景和 阅读详情

相关推荐

稳定性性能系列之五——Native Crash深度分析:工具实战

深入理解Native Crash的机制与分析方法,掌握addr2line、ndk-stack、gdb等核心工具的实战使用,学会从Tombstone文件中快速定位问题根因

Cheson的专栏 1543

GetMessage()和PeekMessage()区别

GetMessage() 原型:BOOL GetMessage(LPMSG lpMsg, HWND hWNd, UINT wMsgFilterMin, UINT wMsgFilterMax); Retrieves a message from the calling threads queque. The function dispatches incoming sent message un...

weixin_30258027的博客 379

CANoe从入门到精通“保姆级”教程(二)- 堪称全网“最全”系列

CANoe各功能区介绍;

车载控制器AutoSAR软件开发工程师 2万+

魔兽世界API魔兽世界全局函数

魔兽世界API 魔兽世界全局函数 帐号游戏时间范围函数 (Account PlayTime Limit Functions)此类API函数是专门为防沉迷系统而设计的,能计算出当前玩家游戏时间等内容,当前只在亚洲地区有效。 GetBillingTimeRested() - 返回当前帐户已登陆时间。 PartialPlayTime() - 如果用户状态为“疲劳(tired)”则返回1:降低经验及掉落。 NoPlayTime() - 如果用户状态为“不健康的(unhealthy)”则返回1:无经验及掉落。 动作

qq_18882253的博客 3万+

【脑电分析系列】第7篇:频域分析基石 — 功率谱密度(PSD)的计算与常见方法对比

本文探讨了脑电图(EEG)频域分析的核心方法——功率谱密度(PSD)。通过对比基于快速傅里叶变换的周期图法和更稳健的Welch's方法,指出后者通过分段、加窗和平均处理,能有效降低估计方差,更适合分析非稳态的脑电信号。文章详细解析了关键参数设置对频率分辨率和统计稳定性的影响,并提供了Python计算实现。PSD分析将复杂的脑电信号转换为直观的频域特征,为研究认知功能和神经疾病提供重要依据。

qq_32516809的博客 1802

零信任架构实战:“持续验证+动态授权”全流程解析(附策略引擎联动图)

《零信任实战指南:7图拆解核心流程与行业案例》摘要:本文通过7张架构图系统解析零信任五大核心流程:强身份认证、设备检查、动态授权、持续监控和自动降权。对比金融(重数据审计)与制造业(重物理绑定)的落地差异,指出三大常见误区及解决方案。数据显示,零信任可使安全响应提速60%,泄露成本降低45%。文章提供6个月实施路线图,强调零信任是"智能信任"体系,建议企业分阶段改造,优先保护核心系统。附赠金融/制造行业策略模板及甘特图示例。(149字)

sara_han的博客 773

Windows API (DAY11) GetMessage 函数

应用程序为了获取源源不断的消息,就需要调用函数 GetMessage 来实现,因为所有在窗 口上的输入消息,都会放到应用程序的消息队列里,然后再发送给窗口回调函数处理。 函数 GetMessage 声明如下: WINUSERAPI BOOL WINAPI GetMessageA( out LPMSG lpMsg, in_opt HWND hWnd, in UINT wMsgFilterMin, i...

狼走西河 1512

Qt Creator牵手DeepSeek,开启AI开发新征程

Qt Creator 是一款功能强大的跨平台集成开发环境(IDE),专为 Qt 应用程序开发量身定制。它支持在编程过程中使用 GitHub Copilot 等编码助手,能帮助开发者为桌面、移动端和嵌入式平台创建软件。在代码编辑方面,Qt Creator 具备代码补全、语法突出显示、重构等功能,内置文档也随手可得,极大提高了代码编写的效率和准确性。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 7189

Windows API编程04-你的第一个Windows窗口

窗口是由窗口类来管理的。

smiler_D的博客 1714

AgentScope Java 2.0 项目实战: 从零构建自己的个人AI助手“小龙虾“

本文系统介绍如何基于Spring Boot WebFlux、React 18和TypeScript,从零搭建一个本地化的个人AI助手管理平台——AgentScope Paw。项目支持多Agent创建与管理、SSE流式对话、工作区文件CRUD、技能市场、子智能体孵化、AI辅助起草Agent配置等核心功能,并深度集成钉钉、企业微信、飞书、GitHub等IM通道。

program哲学 1424

0.1 专栏导读:为什么需要从 MM 理解 HMM

本文探讨了GPU计算框架中CPU与GPU内存管理的困境,介绍了Linux内核的HMM(Heterogeneous Memory Management)解决方案。传统显式拷贝模型存在编程复杂、指针失效等问题,而HMM通过共享虚拟地址空间、自动页面迁移等机制实现透明内存管理。文章分析了HMM依赖的Linux内存管理基础设施,包括页表遍历、MMU通知、ZONE_DEVICE等核心组件,并梳理了从经典MM到支持异构设备的进化历程。最后给出了学习HMM的8层知识体系,强调理解底层MM机制是掌握HMM的关键。

图形/计算GPU的驱动与虚拟化技术分享园地 763

GetMessage(), PeekMessage(), PostMessage(), SendMessage()

GetMessage () and PeekMessage () GetMessage 其唯一用途就是从事件对列中获得消息,并进行处理。 当程序在等待通过 GetMessage 传递的消息时,主事件循坏基本上是锁定的。即,如果消息队列中没有消息,则GetMessage()不会返回,一直等待.. 那么,如果我们要处理实时的事件循坏该怎么办呢?Windows 为我们提供了另一个函数 PeekMe

zb872676223的专栏 534

Modis数据处理工具:MRT百度网盘下载和手把手图文安装教程

如下图所示为MODIS Reprojection Tool(MRT)的软界面,看似简单,却是Modis遥感影像必不可少的处理工具,如投影变换等。本文以图文并茂的形式,详细讲解MRT软件在Windows10平台上的安装过程,并附MRT软件百度网盘下载地址。 Modis Tool主界面: 一、安装过程 1、安装Java运行环境 双击Java.exe,安装运行环境。默认的安装路径为C:\Program Files (x86)\Java\jre6\bin,后面需要用到这个路径。 等待...

智慧空间实验室 2623

关于windows消息轮询

windows是消息轮询机制,那这样的程序将不断循环接收消息直到结束,岂不是很占用资源?如果我编写一个c++程序用循环来不断更新显示时间,cpu占用率会很高,那么windows是用什么办法使得那些消息轮询的程序占用很少资源呢?      消息循环中,用到最多的函数是GetMessage()和PeekMessage(),GetMessage()函数在消息队列为空时,是不返回 的,这时系统不会给

woshizfs(软件开发)的专栏 1486

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

No MFC 编程07 - 做个优化的消息泵

      消息泵也就是消息(处理)循环 (Message Loop),每个基于事件驱动编写出来的 Windows 程序都应该有一个。   消息循环(Message Loop)是程序的心脏,保证程序的正常运行,它的形状大概如下面的结构。    while (true)  {     // 内部处理  }     可见,它应该是不断循环的一段代码, 打破它的循环可以有条件的使用 brea

1370

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

windows消息机制

windows消息机制 一 Windows中有一个系统消息队列,对于每一个正在执行的Windows应用程序,系统为其建立一个“消息队列”,即应用程序队列,用来存放该程序可能 创建的各种窗口的消息。应用程序中含有一段称作“消息循环”的代码,用来从消息队列中检索这些消息并把它们分发到相应的窗口函数中。 二 Windows为当前执行的每个Windows程序维护一个「消息队列」。在发生输入事件之后

1979

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

关于windows的消息轮询

在网上看到的一个问题,觉得很有意义: 问:windows是消息轮询机制,那这样的程序将不断循环接收消息直到结束,岂不是很占用资源?如果我编写一个c++程序用循环来不断更新显示时间,cpu占用率会很高,那么windows是用什么办法使得那些消息轮询的程序占用很少资源呢? 答:消息循环中,用到最多的函数是GetMessage()和PeekMessage(),GetMessage()函数在...

abble32189的博客 202

windows消息机制[图]

<br /> <br />一 Windows中有一个系统消息队列,对于每一个正在执行的Windows应用程序,系统为其建立一个“消息队列”,即应用程序队列,用来存放该程序可能创建的各种窗口的消息。应用程序中含有一段称作“消息循环”的代码,用来从消息队列中检索这些消息并把它们分发到相应的窗口函数中。<br /> <br /><br /> <br />二 Windows为当前执行的每个Windows程序维护一个「消息队列」。在发生输入事件之后,Windows将事件转换为一个「消息」并将消息放入程序的消息队列中。

ceabie的专栏 790

Windows消息队列

转自: 一 Windows中有一个系统消息队列,对于每一个正在执行的Windows应用程序,系统为其建立一个“消息队列”,即应用程序队列,用来存放该程序可能 创建的各种窗口的消息。应用程序中含有一段称作“消息循环”的代码,用来从消息队列中检索这些消息并把它们分发到相应的窗口函数中。   二 Windows为当前执行的每个Windows程序维护一个「消息队列」。在发生输入事件之

ahuang1900的专栏 583

GetMessage TranslateMessage DispatchMessage 和PeekMessage

GetMessage 函数功能 GetMessage是计算机编程中的一个函数,从调用线程的消息队列里取得一个消息并把其放于指定的结构。GetMessage函数可取得与指定窗口联系的消息和由PostThreadMesssge寄送的线程消息,接收一定范围的消息值,不接收属于其他线程或应用程序的消息。GetMessage获取消息成功后,线程把从消息队列中删除该消息,函数会一直等待直到有消息到来才有返回值。 函数声明 WINUSERAPI BOOL WINAPI GetMessage( _Out_ LPMS

寻梦&之璐 1250
上一篇: cache缓存器的映射机制解读
下一篇: Windows 窗口过程 与 窗口退出机制
OneTrianee
博客等级 码龄9年 32粉丝 152原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值