如果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
    }

}

最佳答案

如果GetMessage失败并返回-1,那么通常您的第一个代码块确实会导致无限循环。因此,如果-1是可能的返回值,这就是为什么您看到第二个代码块形式的MSDN示例的原因。

然而,

GetMessage(&msg, NULL, WM_SPEVENT, WM_SPUUIEVENT)

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

雷蒙德·陈(Raymond Chen)在此处介绍了此内容:When will GetMessage return -1?

10-08 07:54