2014-10-07 108 views
3

如果GetMessage(...)失败,消息是否不会从消息队列中删除?我问,因为当我有下面的循环,我最终将进入一个无限循环试图一遍又一遍处理同样的消息:GetMessage失败时会发生什么?

while(GetMessage(&msg, NULL, WM_SPEVENT, WM_SPUUIEVENT)) 
{ 
     //Do something with my message. (Translate + dispatch perhaps, if I wanted) 
} 

因为我不处理的GetMessage失败的情况下,将循环卡住在一遍又一遍的相同的消息?这是为什么下面是实现一个循环?:

while((bRet = GetMessage(&msg, NULL, WM_SPEVENT, WM_SPUUIEVENT)) != 0) 
{ 
    if (bRet == -1) 
    { 
     // 
    } 
    else 
    { 
     //Do something with my message 
    } 

} 

回答

5

如果GetMessage失败并返回-1,那么通常你的第一个代码块确实会导致一个无限循环的正确方法。所以,如果-1是一个可能的返回值,那就是为什么你会看到第二个代码块形式的MSDN样本。

然而,

​​

永远不会失败,因此永远不会返回-1GetMessage的故障模式是&msg引用了无效内存,或者第二个参数窗口句柄无效。这两种失效模式都不会发生,假设msg已被正确定义。通常它是一个局部变量,所以&msg总是很好。

Raymond Chen在这里覆盖:When will GetMessage return -1?

+0

这非常有道理。 Raymond Chen的这一点也是一个很好的资源 - 谢谢! – phillythompson 2014-10-07 14:54:03