- GetMessage()函数的消息循环的汇编代码
解读:.while TRUE invoke GetMessage,addr @stMsg,NULL,0,0 .break .if eax == 0 invoke TranslateMessage,addr @stMsg invoke DispatchMessage,addr @stMsg .endw ret- 调用 GetMessage 函数,函数中都要用到一个MSG结构体,那是用来存储 消息信息 的。
- Windows结构体的定义都放在 windows.inc 这个文件中,我们可以从中查到 MSG的定义
参数介绍:MSG STRUCT hwnd DWORD ? message DWORD ? wParam DWORD ? lParam DWORD ? time DWORD ? pt POINT <> MSG ENDS- hwnd - 消息发送的窗口句柄。
- message - 消息标识符,表示何种消息。
- wParam - 消息参数之一。
- lParam - 消息参数之二。
- time - 消息放入消息队列的时间。
- pt - POINT数据结构,表示消息放入消息队列时的鼠标坐标。
- 理解:
- GetMessage()函数相当于开始拿着一个空的MSG,然后去消息队列中获取。

- 当发现MSG中的消息是WM_QUIT时,则GetMessage()返回值为0,返回值保存在寄存器eax中,所以,此时,程序就会结束消息循环,也就是退出窗口过程。
- Windows窗口程序的本质就是 消息循环,对于 所有函数信息的处理,都遵循这一套模板,哪怕windows内置的函数也是这样的。
- GetMessage()函数相当于开始拿着一个空的MSG,然后去消息队列中获取。
- PeekMessage()的消息循环:
- Windows是一个抢占式的操作系统,任务每20ms切换一次。
- 对于GetMessage()来讲,轮到自己的20ms时,它会读取并处理消息,但消息队列里没有属于它一份的消息,它就会停留在GetMessage函数内部,当Windows发现它这样时,Windows认为该窗口没有要处理的,此时就会剥夺它的时间,所以,GetMessage函数是程序空闲的时候主动将控制权交给Windows的一种方式。
- PeekMessage()与GetMessage()类似,区别时在没有消息时,它不会像GetMessage()那样在内部停留,而是直接返回,并且设置eax为0,所以,在0时,程序会检查是否是WM_QUIT。
- 所以,PeekMessage在没有收到消息的时候会一直循环检测,从而Windows不会剥夺该任务的时间片,也就是说,20ns的时间片内,就算没有消息,它也会一直在循环检测不会吧控制权交还给Windows程序。
相关推荐
稳定性性能系列之五——Native Crash深度分析:工具实战
深入理解Native Crash的机制与分析方法,掌握addr2line、ndk-stack、gdb等核心工具的实战使用,学会从Tombstone文件中快速定位问题根因
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...
CANoe从入门到精通“保姆级”教程(二)- 堪称全网“最全”系列
CANoe各功能区介绍;
魔兽世界API魔兽世界全局函数
魔兽世界API 魔兽世界全局函数 帐号游戏时间范围函数 (Account PlayTime Limit Functions)此类API函数是专门为防沉迷系统而设计的,能计算出当前玩家游戏时间等内容,当前只在亚洲地区有效。 GetBillingTimeRested() - 返回当前帐户已登陆时间。 PartialPlayTime() - 如果用户状态为“疲劳(tired)”则返回1:降低经验及掉落。 NoPlayTime() - 如果用户状态为“不健康的(unhealthy)”则返回1:无经验及掉落。 动作
【脑电分析系列】第7篇:频域分析基石 — 功率谱密度(PSD)的计算与常见方法对比
本文探讨了脑电图(EEG)频域分析的核心方法——功率谱密度(PSD)。通过对比基于快速傅里叶变换的周期图法和更稳健的Welch's方法,指出后者通过分段、加窗和平均处理,能有效降低估计方差,更适合分析非稳态的脑电信号。文章详细解析了关键参数设置对频率分辨率和统计稳定性的影响,并提供了Python计算实现。PSD分析将复杂的脑电信号转换为直观的频域特征,为研究认知功能和神经疾病提供重要依据。
零信任架构实战:“持续验证+动态授权”全流程解析(附策略引擎联动图)
《零信任实战指南:7图拆解核心流程与行业案例》摘要:本文通过7张架构图系统解析零信任五大核心流程:强身份认证、设备检查、动态授权、持续监控和自动降权。对比金融(重数据审计)与制造业(重物理绑定)的落地差异,指出三大常见误区及解决方案。数据显示,零信任可使安全响应提速60%,泄露成本降低45%。文章提供6个月实施路线图,强调零信任是"智能信任"体系,建议企业分阶段改造,优先保护核心系统。附赠金融/制造行业策略模板及甘特图示例。(149字)
Windows API (DAY11) GetMessage 函数
应用程序为了获取源源不断的消息,就需要调用函数 GetMessage 来实现,因为所有在窗 口上的输入消息,都会放到应用程序的消息队列里,然后再发送给窗口回调函数处理。 函数 GetMessage 声明如下: WINUSERAPI BOOL WINAPI GetMessageA( out LPMSG lpMsg, in_opt HWND hWnd, in UINT wMsgFilterMin, i...
Qt Creator牵手DeepSeek,开启AI开发新征程
Qt Creator 是一款功能强大的跨平台集成开发环境(IDE),专为 Qt 应用程序开发量身定制。它支持在编程过程中使用 GitHub Copilot 等编码助手,能帮助开发者为桌面、移动端和嵌入式平台创建软件。在代码编辑方面,Qt Creator 具备代码补全、语法突出显示、重构等功能,内置文档也随手可得,极大提高了代码编写的效率和准确性。
Windows API编程04-你的第一个Windows窗口
窗口是由窗口类来管理的。
AgentScope Java 2.0 项目实战: 从零构建自己的个人AI助手“小龙虾“
本文系统介绍如何基于Spring Boot WebFlux、React 18和TypeScript,从零搭建一个本地化的个人AI助手管理平台——AgentScope Paw。项目支持多Agent创建与管理、SSE流式对话、工作区文件CRUD、技能市场、子智能体孵化、AI辅助起草Agent配置等核心功能,并深度集成钉钉、企业微信、飞书、GitHub等IM通道。
0.1 专栏导读:为什么需要从 MM 理解 HMM
本文探讨了GPU计算框架中CPU与GPU内存管理的困境,介绍了Linux内核的HMM(Heterogeneous Memory Management)解决方案。传统显式拷贝模型存在编程复杂、指针失效等问题,而HMM通过共享虚拟地址空间、自动页面迁移等机制实现透明内存管理。文章分析了HMM依赖的Linux内存管理基础设施,包括页表遍历、MMU通知、ZONE_DEVICE等核心组件,并梳理了从经典MM到支持异构设备的进化历程。最后给出了学习HMM的8层知识体系,强调理解底层MM机制是掌握HMM的关键。
GetMessage(), PeekMessage(), PostMessage(), SendMessage()
GetMessage () and PeekMessage () GetMessage 其唯一用途就是从事件对列中获得消息,并进行处理。 当程序在等待通过 GetMessage 传递的消息时,主事件循坏基本上是锁定的。即,如果消息队列中没有消息,则GetMessage()不会返回,一直等待.. 那么,如果我们要处理实时的事件循坏该怎么办呢?Windows 为我们提供了另一个函数 PeekMe
Modis数据处理工具:MRT百度网盘下载和手把手图文安装教程
如下图所示为MODIS Reprojection Tool(MRT)的软界面,看似简单,却是Modis遥感影像必不可少的处理工具,如投影变换等。本文以图文并茂的形式,详细讲解MRT软件在Windows10平台上的安装过程,并附MRT软件百度网盘下载地址。 Modis Tool主界面: 一、安装过程 1、安装Java运行环境 双击Java.exe,安装运行环境。默认的安装路径为C:\Program Files (x86)\Java\jre6\bin,后面需要用到这个路径。 等待...
关于windows消息轮询
windows是消息轮询机制,那这样的程序将不断循环接收消息直到结束,岂不是很占用资源?如果我编写一个c++程序用循环来不断更新显示时间,cpu占用率会很高,那么windows是用什么办法使得那些消息轮询的程序占用很少资源呢? 消息循环中,用到最多的函数是GetMessage()和PeekMessage(),GetMessage()函数在消息队列为空时,是不返回 的,这时系统不会给
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
Camera2Demo
在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作
windows消息机制
windows消息机制 一 Windows中有一个系统消息队列,对于每一个正在执行的Windows应用程序,系统为其建立一个“消息队列”,即应用程序队列,用来存放该程序可能 创建的各种窗口的消息。应用程序中含有一段称作“消息循环”的代码,用来从消息队列中检索这些消息并把它们分发到相应的窗口函数中。 二 Windows为当前执行的每个Windows程序维护一个「消息队列」。在发生输入事件之后
pscad IEEE标准系统搭建说明
pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。
关于windows的消息轮询
在网上看到的一个问题,觉得很有意义: 问:windows是消息轮询机制,那这样的程序将不断循环接收消息直到结束,岂不是很占用资源?如果我编写一个c++程序用循环来不断更新显示时间,cpu占用率会很高,那么windows是用什么办法使得那些消息轮询的程序占用很少资源呢? 答:消息循环中,用到最多的函数是GetMessage()和PeekMessage(),GetMessage()函数在...
windows消息机制[图]
<br /> <br />一 Windows中有一个系统消息队列,对于每一个正在执行的Windows应用程序,系统为其建立一个“消息队列”,即应用程序队列,用来存放该程序可能创建的各种窗口的消息。应用程序中含有一段称作“消息循环”的代码,用来从消息队列中检索这些消息并把它们分发到相应的窗口函数中。<br /> <br /><br /> <br />二 Windows为当前执行的每个Windows程序维护一个「消息队列」。在发生输入事件之后,Windows将事件转换为一个「消息」并将消息放入程序的消息队列中。
Windows消息队列
转自: 一 Windows中有一个系统消息队列,对于每一个正在执行的Windows应用程序,系统为其建立一个“消息队列”,即应用程序队列,用来存放该程序可能 创建的各种窗口的消息。应用程序中含有一段称作“消息循环”的代码,用来从消息队列中检索这些消息并把它们分发到相应的窗口函数中。 二 Windows为当前执行的每个Windows程序维护一个「消息队列」。在发生输入事件之
GetMessage TranslateMessage DispatchMessage 和PeekMessage
GetMessage 函数功能 GetMessage是计算机编程中的一个函数,从调用线程的消息队列里取得一个消息并把其放于指定的结构。GetMessage函数可取得与指定窗口联系的消息和由PostThreadMesssge寄送的线程消息,接收一定范围的消息值,不接收属于其他线程或应用程序的消息。GetMessage获取消息成功后,线程把从消息队列中删除该消息,函数会一直等待直到有消息到来才有返回值。 函数声明 WINUSERAPI BOOL WINAPI GetMessage( _Out_ LPMS
1543



被折叠的 条评论
为什么被折叠?



