请教对windows消息及消息队列机制比较熟悉的前辈
废话不多说,直奔主题: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,先取你期望的类型,再取剩下的类型,而不能是把剩下的留在队列里。
以上纯属我自己杜撰出来了,我翻查好久也没找到比较确定的描述,可能在眼前我编程中也用不到消息过滤,但这个问题我是真想搞懂到底是怎么回事,在我脑海中困扰不是一天两天了。。。
希望愿意回答的前辈能找出比较有说服力的答案,不要像我前面那样想当然哦。。。