Windows 消息循环 GetMessage() PeekMessage()

article/2025/11/4 8:18:59
  1. GetMessage()函数的消息循环的汇编代码
    .while	TRUEinvoke	GetMessage,addr @stMsg,NULL,0,0.break	.if eax	== 0invoke	TranslateMessage,addr @stMsginvoke	DispatchMessage,addr @stMsg.endwret
    
    解读:
    1. 调用 GetMessage 函数,函数中都要用到一个MSG结构体,那是用来存储 消息信息 的。
    2. Windows结构体的定义都放在 windows.inc 这个文件中,我们可以从中查到 MSG的定义
      	MSG STRUCThwnd      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程序。

http://chatgpt.dhexx.cn/article/ogOHqBuQ.shtml

相关文章

WindowsMessage

消息介绍 Windows是一个消息&#xff08;Message&#xff09;驱动系统&#xff0c;它不是由事件的顺序来控制&#xff0c;而是由事件的发生来控制&#xff0c;而这种事件的发生是随机的、不确定的&#xff0c;并没有预定的顺序&#xff0c;这样就允许程序的用户用各种合理的顺序…

从内核层说清GetMessage , DispatchMessage

文章目录 要点回顾&#xff1a;为什么拿到句柄非得要回零环&#xff1f;消息队列&#xff08;总共有7个小队列&#xff09;结构GetMessage的声明&#xff1a;GetMessage进入内核&#xff1a;GetMessage的功能总结&#xff1a;DispatchMessage举例验证&#xff08;有前提情况&am…

Message的消息池(sPool)

关键总结 1、消息池缓存有可重复使用的消息实例&#xff0c;避免过多的创建与回收消息实例 2、消息池是一个栈&#xff08;LIFO/FILO后进先出/先进后出&#xff09;的数据结构&#xff0c;具体的数据存放是采用了链表方式 3、消息池一开始是空的&#xff0c;需要主动添加消息进…

信息炸弹——Message Boom

前言 好的今天我们来讨论一下什么叫信息炸弹。 可能之前看过我文章的小伙伴们在想&#xff0c;这种听名字就具有攻击性的东西为什么不把它放到黑客七宗罪专栏里&#xff1f; 毕竟这只是个脚本&#xff0c;对于个人账号的攻击性确实强&#xff0c;聊天记录也会占用硬盘。但是…

handler+message【消息机制】

&#x1f356;&#x1f356; 作者 &#xff1a; 不良使 &#x1f356;&#x1f356;&#x1f356;&#x1f356; 潜力创作新星 华为云享专家 &#x1f356;&#x1f356;&#x1f356;&#x1f356;&#x1f356; PythonAndroid &#x1f356;&#x1f356;&#x1f356;&#…

c++中MessageBox弹窗的用法大全

想必大家都知道&#xff0c;MessageBox函数是c语言中很常用且好玩的函数之一&#xff0c;那你知道它怎么用吗&#xff1f; 这是MessageBox函数的标准格式之一&#xff0c;本人喜欢用这种格式&#xff0c;注意函数的大小写&#xff01; MessageBox不在 #include<bits/stdc.h&…

message broker

MB概述 MB的全称是message broker&#xff0c;即“消息代理”。“消息”一词前几年比较火&#xff0c;消息中间件也卖的很火&#xff0c;当时似乎J2EE的产品都要跟“消息”、“中间件”扯上点关系&#xff0c;以彰显潮流。我觉得初学者只需记住“消息”的异步性即可&#xff0c…

MP3音频文件格式(MPEG-1 audio layer 3)

MP3音频文件格式 【百度百科】mp3 &#xff08;一种音频编码方式&#xff09; 【维基百科】MP3&#xff08;本文重定向自 MPEG-1 Audio Layer 3&#xff09; MP3(MPEG-1 audio layer 3) MPEG-1音频分三层&#xff0c;分别为 MPEG-1 Layer1&#xff0c;MPEG-1 Layer2 以及 MPE…

怎么把wav文件改成mp3?

怎么把wav文件改成mp3&#xff1f;有过摄像摄影经历的小伙伴都应该认识wav&#xff0c;wav就是他们作品的保存格式。因为wav格式的文件体积特别大&#xff0c;在储存的时候会占用我们大量的内存&#xff0c;而且为了播放方便&#xff0c;我们通常要把wav文件改成mp3格式的&…

音频文件如何转成mp3格式

当提到音频文件格式时&#xff0c;大家往往会想到最为流行和广泛使用的mp3格式。mp3是一种广受欢迎的音频格式&#xff0c;因为各种音频格式自身特点的原因&#xff0c;所以将其他格式的音频文件转换成mp3是非常普遍的需求。就比如在我们日常生活中&#xff0c;下载到的各种格式…

如何转换音频格式为mp3?

一提到音乐&#xff0c;大家先想到的应该就是MP3了&#xff0c;既然MP3作为常用的&#xff0c;被大家所熟知的一种音频格式&#xff0c;那它必定有其他格式无可比拟的优点。其实mp3从功能上来讲它具有更强的携带性和传输性&#xff0c;利于保存和分享&#xff1b;其次MP3本身的…

电脑音频转换mp3格式怎么弄,教你音频怎么转换mp3格式

mp3格式是目前几乎全兼容的格式了&#xff0c;在我们参加一些会议或讲座时&#xff0c;需要录制一些重要的信息&#xff0c;结束后再进行复盘或分享。然而&#xff0c;不同的录制工具录制的音频格式也不同&#xff0c;这时使用软件将音频统一成mp3格式的话&#xff0c;就会方便…

免费在线MP3转换器:将音乐文件转换为MP3格式

在今天的数字时代&#xff0c;音乐成为了人们生活中不可或缺的一部分。然而&#xff0c;由于音乐文件格式的不同&#xff0c;我们有时可能无法在不同的设备上播放我们最喜爱的歌曲。MP3格式作为最常用的音乐文件格式之一&#xff0c;通常可以被几乎所有的设备支持&#xff0c;因…

mp3格式怎么弄?分享三个音频文件格式转换的方法

不知道小伙伴们有没有遇到过这样的情况&#xff0c;在网上下载一首歌下来&#xff0c;正想打开&#xff0c;结果却发现我们的播放器无法播放。你们知道这是为什么嘛&#xff0c;其实我们的音频文件是有很多不同的格式&#xff0c;其中就有些比较少见的格式&#xff0c;我们的音…

如何从MP4视频文件中抽取MP3音频?

简 介&#xff1a; 为了能够处理视频中的音频&#xff0c;测试了两种提取视频中的音频方法。一种是利用格式工程软件另外一种利用ffmpeg软件。 关键词&#xff1a; 视频文件&#xff0c;音频文件&#xff0c;mp4&#xff0c;mp3 #mermaid-svg-sPs0isryqtLTjZyg {font-family:&q…

如何将音频文件转换为MP3格式?

音频文件有很多种格式&#xff0c;如 WAV、FLAC、AAC 等&#xff0c;其中 MP3 是最为常见的一种格式&#xff0c;因为它具有压缩比高、音质损失少、兼容性强等优点&#xff0c;适合在各种设备上播放。如果你想将一个音频文件转换为 MP3 格式&#xff0c;可以采用以下几种方法&a…

Next() Nextline() hasNext()区别

next类和hasNext方法遇到缓冲区没数据时&#xff0c;会阻塞&#xff0c;等待输入后next类会读取&#xff0c;hasNext会返回true 1&#xff09;nextLine nextLine&#xff08;&#xff09;方法返回的是"\n"之前的所有字符&#xff0c;它是可以得到带空格的字符串的。 …

BNext

又搬来了大神器啊 来自德国HassoPlattner计算机系统工程研究院的NianhuiGuo和HaojinYang等研究者提出了BNext模型&#xff0c;成为第一个在ImageNet数据集上top1分类准确率突破80%的BNN。 两年前&#xff0c;依靠早期 BNN 工作 XNOR-Net 起家的 XNOR.AI 被苹果公司收购&#…

Next.js学习笔记

这是一个用于生产环境的React 框架&#xff0c;Next.js 为您提供生产环境所需的所有功能以及最佳的开发体验&#xff1a;包括静态及服务器端融合渲染、 支持 TypeScript、智能化打包、 路由预取等功能 无需任何配置。 create-next-app 使用 create-next-app创建新的 Next.js …

搭建vue3项目时出现Cannot read property ‘nextSibling‘ of null报错

记录自己学习中&#xff0c;出现的错误 在搭建vue3项目&#xff0c;配置router&#xff0c;vuex,element-ui后&#xff0c;运行项目页面白屏&#xff0c;控制台出现了Cannot read property nextSibling of null的错误 查看main.ts 文件&#xff0c;此时的写法是&#xff1a; …