加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

windows – 消息队列在Win32中如何工作?

发布时间:2020-12-14 02:14:18 所属栏目:Windows 来源:网络整理
导读:我在Win32上阅读了一些内容以及消息循环是如何工作的,而且还有一些东西对我来说还不清楚:消息队列中究竟存储了什么?对应于消息(WM_COMMAND,WM_CREATE等)的整数值或指向包含消息整数值的MSG结构的指针以及wParam,lParam等其他内容? 解决方法 为了回答你的
我在Win32上阅读了一些内容以及消息循环是如何工作的,而且还有一些东西对我来说还不清楚:消息队列中究竟存储了什么?对应于消息(WM_COMMAND,WM_CREATE等)的整数值或指向包含消息整数值的MSG结构的指针以及wParam,lParam等其他内容?

解决方法

为了回答你的问题,队列中的每条消息至少都存储了

>消息所针对的窗口句柄,
>消息代码,wParam和lParam,正如您已经正确指出的那样,
>发布消息的时间,您使用GetMessageTime()检索,
>对于UI消息,发布消息时光标的位置(请参阅GetMessagePos()).

请注意,并非所有消息都实际存储在队列中.从不存储从SendMessage()发送到拥有该窗口的线程的窗口的消息;相反,直接调用接收器窗口的消息功能.从其他线程发送的消息被存储直到被处理,并且发送线程阻塞直到消息被回复,通过退出窗口函数或显式地调用ReplyMessage(). API函数InSendMessage()有助于确定windows函数是否正在处理从另一个线程发送的消息.

您或系统发布的消息存储在队列中,但有一些例外. WM_TIMER消息从未实际存储过;相反,如果队列中没有其他消息并且计时器已经成熟,则GetMessage()构造一个计时器消息.这意味着,首先,定时器消息具有最低的出队优先级,其次,来自短周期定时器的多个消息永远不会溢出队列,即使GetMessage()没有被调用一段时间.同样,WM_QUIT也不存储,而只是标记. GetMessage()假装在队列耗尽后检索WM_QUIT,这是它检索的最后一条消息.可能还有其他例外和内部优化.

使用PostMessage()发布的消息最终位于拥有发布消息的窗口的线程的队列中.

消息以什么形式存储在内部,我们不知道,我们也不在乎. Windows API完全抽象出来. MSG结构填充在您传递给GetMessage()或PeekMessage()的内存中.除了Windows SDK指南中记录的内容之外,您无需了解或担心内部实现的详细信息.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读