GetMessage失败会发生什么?

时间:2014-10-07 14:35:44

标签: c++ winapi

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

}

1 个答案:

答案 0 :(得分:5)

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

然而,

GetMessage(&msg, NULL, WM_SPEVENT, WM_SPUUIEVENT)

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

Raymond Chen在此处介绍了这一点:When will GetMessage return -1?