Win32学习笔记(14)消息队列

本文介绍了Windows操作系统中消息队列的概念,每个线程拥有一个消息队列,用于存储用户交互产生的消息。操作系统首先捕获这些消息,然后根据窗口对象找到对应的线程,将消息放入消息队列。线程从消息队列中取出消息并进行处理。尽管一个线程可以有多个窗口,但所有窗口的消息都共享同一个消息队列。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.什么是消息?

当我们点击鼠标的时候,或者当我们按下键盘的时候,操作系统都要把这些动作记录下来,存储到一个结构体中,这个结构体就是消息。

比如我们打开一个窗口,我们用鼠标点,键盘按等动作都会被操作系统收集起来,会把这些信息存储到一个结构体中,这个结构体就是消息。

2.消息队列:每个线程只有一个消息队列

我们知道进程、线程在内核层都有一个结构体。

如图一个进程中有两个线程那么就有两个消息队列,右边那两个线程可以看成两个大的数组,一个大的容器用来存储消息。消息队列是与线程相关的,我们在线程中画界面无论画多少个都共用一个消息队列,所以线程与消息队列是一一对应的关系。

我们刚才说过了我们点鼠标、按键盘都会产生消息,那么消息储存到哪里了?就是储存到消息队列里了,是操作系统替我们存的,所以最先捕获消息的是我们的操作系统。就比如我们想要关闭一个窗口点击×号,好像是应用程序先捕捉到消息,实际不是这样的,是操作系统先接收到了动作,再把这个动作发送给你这个进程对应的线程,线程再做出处理(把窗口关掉)。

3.窗口与线程

如图,我们知道可以同时开很多应用程序。那么比如我随便点一个×号,那么为什么关闭的就是对应的应用程序而不是别的?我们并不能理解成因为我们点的是它那理所当然关的就是它。上面我们知道,点击时是操作系统最先捕获消息,操作系统会把各种信息(你点的是什么,左键还是右键等)封装到一个结构体中,这个结构体我们称为消息。如图,我们有三个线程,也就是有三个消息队列,那么这个消息该给谁呢?怎么给到对应的线程呢?这是我们该想的。

之前我们学习过,所有的窗口都是由win32k.sys这个模块画出来的,其实每个窗口在内核中都有一个对应的结构体。这个结构体描述了很多重要的信息(多宽,多高,在哪个位置等等)这个结构体中还有一个重要的成员就是当前

这个窗口所属的线程是谁。

所以当我们点击×时,操作系统会根据我们点的时左键还是右键等其他操作生成一个消息,不过没有办法找到这个消息是属于谁的,只能找到这个消息应该给哪个窗口对象。

上面那个窗口对应的结构体我们称为窗口对象

每个窗口对象里有个指针,指向线程。所以操作系统能找到对应的窗口对象,窗口对象又指向对应线程,消息队列在线程中。这样消息就能传递给对应线程做出反应。

下面我们整体描述一下

首先操作系统收到了这个动作,把它的类型,坐标等封装到一个结构体里。操作系统在底层就会遍历所有窗口对象找到对应的窗口对象,之后通过窗口对象找到对应的线程,把消息存放的线程中的消息队列中。最后应用程序取出消息一看,哦~是退出然后就退出了。

4.窗口与线程

一个线程可能有很多窗口无论哪个窗口接到消息都是存到这个线程的消息队列里面,因为消息队列只有一个窗口有很多,窗口只属于一个线程,线程能有很多窗口

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wzprabbit

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值