Windows消息 队列

1、 Windows消息机制

Windows是一个消息驱动的操作系统,消息是用一个常量标识符来标记,并且有两个32Bit的消息附加信息。单击鼠标、敲击键盘,都会通过电脑外设向系统发送特定的中断信号,这个中断信息在操作系统中会转化为一个消息,并存储在系统的一个消息队列中。Windows操作系统会根据当前激活的窗口与鼠标、键盘的操作来决定将消息发给相应的窗口线程。

消息处理过程如下:登录用户移动鼠标或敲击键盘,鼠标或键盘的设备驱动器都把输入转换消息,并把该消息投放到系统消息队列中。Windows会从系统消息队列中每次移走一个消息,先确定目的窗口,再把该消息投递到创建目的窗口的线程消息队列。线程消息队列接收所有该线程创建的窗口的鼠标和键盘消息。每个GUI线程从它的消息队列中移走消息并指导windows系统将消息发送到相应窗口过程进行处理。

                                

  

2、Windows消息队列

Windows操作系统会为每个线程维护一个消息队列,这个消息队列是操作系统维护的,即存在于内核中。内核对象对每个进程都是可见的,即消息队列可以用于进程间通信。
为了提升效率,操作系统并不会立即为每个线程创建消息队列,而是在调用PeekMessage/GetMessage时才创建消息队列。

3、Windows消息传递机制

从消息的发送途径来看,Windows程序中的消息可以分成2种:队列消息和非队列消息,也有叫“进队消息”和“不进队消息”。


3.1 队列消息
 3.1.1. 发送消息

队列消息主要是用来存储通过PostMessage和PostThreadMessage发送的消息,前者是用来发给指定窗口线程,后者则是通过指定线程ID(线程是由内核创建的,线程ID也即是内核唯一)来发送的。
 3.1.2. 接受消息

PeekMessage/GetMessage可以从消息队列中取出消息,PeekMessage查询是否有消息,有则取出并返回成功,无则返回失败。GetMessage则是阻塞式查询,一直等到有消息才返回。

3.2 非队列消息

非队列消息是通过SendMessage来发送给指定窗口线程,并且立即由窗口过程函数来响应。
SendMessage是阻塞的,必须等待指定的窗口过程函数处理完之后才能返回。

4、非UI线程消息队列

非UI线程,因为没有窗口,所以没有句柄,发送消息只能通过PostThreadMessage。取出消息,可以使用PeekMessage/GetMessage。

参考原文:Windows消息队列及C++应用_windows消息队列编程_-飞鹤-的博客-CSDN博客

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值