请教对windows消息及消息队列机制比较熟悉的前辈

shier2817 2015-05-05 02:43:55
废话不多说,直奔主题:GetMessage/PeekMessage 两个API都可以处理得到线程消息队列中的消息,他们各自的作用和区别读了MSDN后还算是比较清楚的,我想要问的是:他们的2-4参数,就是 hWnd、wMsgFilterMin和wMsgFilterMax;这三个参数实际都是用于消息过滤的,虽然我们自己写消息循环的时候大部分都输入0不进行任何过滤处理。但今天我就想问一个我翻了好多资料也没搞清楚的一个问题;
在描述问题前还得啰嗦一句:我知道POST的消息是进入消息队列的,而SEND的不进入,而且在MSDN的PostMessage的页面可以找到,系统默认的消息队列是有限制的,可以在注册表修改:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows
里面有个dowrd键:USERPostMessageLimit,默认值是10000
(某些系统可能没这个键,但没有就表示是默认值);
我要问的是:如果使用了消息过滤(句柄过滤或范围过滤或二者都用),那么不符合条件中的消息不就永远留在消息队列中了吗?那程序运行久了,消息队列不就满了吗?这不就完了吗?。。。。。。
在MSDN的消息与消息队列以及相关API的章节中可以读出一个关于上面3个参数的大概意思好像是说:这些过滤机制对于需要查找随后进入队列的消息的时候比较有用;也对需要改变消息的处理顺序(不管上面哪个API,他们默认对消息的处理都有个固定的顺序,比如先发送的消息、然后投递的消息、再然后是硬件输入的消息等等)的情况下比较有用,比如说你想先处理硬件输入消息后处理投递消息就可以用过滤机制先取出该类型的消息;
说这么一堆我是想表达:我自己非要找个可以解释我前面提到的问题的理由的话,我只能猜想说:
不管你过滤还是不过滤,你都应该处理队列中的所有消息,过滤仅仅是上面提到的2个用处而已;换句话说,如果用了过滤,你应该是不止一次的调用 GetMessage 或 PeekMessage,先取你期望的类型,再取剩下的类型,而不能是把剩下的留在队列里。
以上纯属我自己杜撰出来了,我翻查好久也没找到比较确定的描述,可能在眼前我编程中也用不到消息过滤,但这个问题我是真想搞懂到底是怎么回事,在我脑海中困扰不是一天两天了。。。
希望愿意回答的前辈能找出比较有说服力的答案,不要像我前面那样想当然哦。。。
...全文
259 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
向立天 2015-06-12
  • 打赏
  • 举报
回复
您好 我是本版版主 此帖已多日无人关注 请您及时结帖 如您认为问题没有解决可按无满意结帖处理 另外本版设置了疑难问题汇总帖 并已在版面置顶 相关规定其帖子中有说明 您可以根据规定提交您帖子的链接 如您目前不想结帖只需回帖说明 我们会删除此结帖通知 见此回复三日内无回应 我们将强制结帖 相关规定详见界面界面版关于版主结帖工作的具体办法
zjh824 2015-05-09
  • 打赏
  • 举报
回复
这两函数可带参数move决定是否从队列中移出消息, 然后translate和dispatch来处理默认消息的。
「已注销」 2015-05-09
  • 打赏
  • 举报
回复
楼上的意思是想说,不管是不是在符合条件范围内的消息都会被取出?取出之后再对其检查是否符合,不符合的丢弃。也就是说不会把不符合条件的消息留在队列里??? 但是我觉得不是这样的,在MSDN关于上面2个API的描述中有这么一句: Then the first queued message that matches the specified filter is retrieved. 我记得还在其他位置找到更清晰的描述来着,反正这个意思是说:只从消息队列中取符合条件的消息; 没有任何明确的文字描述不符合条件的消息如何对待。。。
赵4老师 2015-05-08
  • 打赏
  • 举报
回复
概念上来说,过滤的意思就是 取出、检查是否符合过滤的条件:符合,处理;不符合,不处理(形同扔到异次元世界永世不得超生)。 我猜。
「已注销」 2015-05-07
  • 打赏
  • 举报
回复
楼上的这篇文章挺不错的,实际上我现在读MSDN也适当的做做笔记,虽然英文不好但是有时候配合着翻译记下来一些东西避免时间长了忘记了。 对于消息这部分我的笔记与您上面的链接很多内容基本是类似的,只是没人家写的那么全面。 从上面的文章里,可以解决我第二个问题:就是我开始以为: 发送的消息是不经过消息队列的,而直接是调用窗口过程;但读了上面的文章就明白了,得看“是否同线程”; 上面描述过:如果在其他线程向窗口线程SendMessage,即不同线程调用,是先发到消息队列的,但与 PostMessage 不同的是发送函数依然不会立即返回,还是同步等待着该消息并处理完才返回。 换句话说,线程消息队列中确实不只有投递的消息,也会有其他线程发送来的消息;这就可以解释我在2楼补充的那个问题了,为什么消息循环函数还会处理发送的消息,而且他在处理顺序中对于发送消息竟然还处理2次,想必正是为了加快其他线程发来的消息的返回效率,不至于让另外的线程等太久。(当然这又是我自己想的) 从消息的处理机制来划分,消息可以分为队列消息和非队列消息,以前我一直简单的认为:发送的消息就是非队列消息,而投递的消息就是队列消息,现在看起来,这样是错的,不是绝对的,发送的消息有可能也是队列消息。 不过在上面的文章读了之后,依然还是没有解决我在开贴时提出的主要问题: 就是如果使用了消息过滤,留在消息队列中那些不符合过滤条件的消息该怎么处理。。。 因为上文对这方面的描述也仅仅是几笔带过。。。期待对这方面有详细描述的回答。。。 依然感谢楼上!
「已注销」 2015-05-06
  • 打赏
  • 举报
回复
额。。。貌似我帖子发的版块不太合适哦? 其实我不是用VC的,是别的开发语言,我发在这里是因为在发帖之前我搜索了下相关帖子,在这个版块有好几个提问windows消息相关问题的,所以我才发在这里。。。 楼上2位前辈提的MFC都是经过封装的处理吧,我想知道我直接调用系统API,关于所提的两个问题的知识哪里有比较权威的说明呢?
oyljerry 2015-05-05
  • 打赏
  • 举报
回复
具体消息队列的机制,可能要看一下MFC的源码,深入浅出MFC有一些描述,当然最深入的还是自己分析源码了
赵4老师 2015-05-05
  • 打赏
  • 举报
回复
好象在 “《深入浅出MFC》第9章 消息映射与命令绕行” 中有Windows消息处理的细节讲解。
「已注销」 2015-05-05
  • 打赏
  • 举报
回复
哦对了,请允许我再补充另外一个问题,不管上面哪个API,都可以在MSDN中找到一段这样的话:
引用
During this call, the system delivers pending, nonqueued messages, that is, messages sent to windows owned by the calling thread using the SendMessage, SendMessageCallback, SendMessageTimeout, or SendNotifyMessage function. Then the first queued message that matches the specified filter is retrieved. The system may also process internal events. If no filter is specified, messages are processed in the following order: Sent messages Posted messages Input (hardware) messages and system internal events Sent messages (again) WM_PAINT messages WM_TIMER messages
以上见:https://msdn.microsoft.com/en-us/library/windows/desktop/ms644936(v=vs.85).aspx 或者 https://msdn.microsoft.com/en-us/library/windows/desktop/ms644943(v=vs.85).aspx 的 Remarks 部分。 我英文不太好,只能看懂个大概,他这个列表就是说默认处理消息的顺序的,也有文章说消息的优先级,是这个意思吧? 那么这里面怎么还会有:“Sent messages” 呢? 在我的理解上,发送的消息与消息队列无关啊,而是直接调用了窗口过程函数不是么?这两个函数不管是否从消息队列把消息移除,不都是与队列打交道吗?怎么还有非队列消息什么事儿? 而且这里有篇文章:http://blog.csdn.net/charlessimonyi/article/details/8748100 里面来了个“一个有窗口和窗口过程函数但没有消息循环的程序”的测试,而测试的结果虽然是窗口假死,但这也说明了发送的消息不进消息队列,直接交给窗口过程函数处理的说法啊,这在上文中下一个测试里也可见一斑。。。 这又是怎么个意思呢?如您熟悉,请一并解答,感激不尽!

15,978

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧