GetMessage失败会发生什么?

phi*_*son 3 c++ winapi

如果GetMessage(...)失败,消息是否从消息队列中删除?我问,因为当我有以下循环时,我最终会进入一个无限循环,试图反复处理同一个消息:

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

因为我没有处理GetMessage失败的情况,循环会不会一遍又一遍地停留在同一个消息上?这是为什么以下是实现循环的正确方法?:

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

}
Run Code Online (Sandbox Code Playgroud)

Dav*_*nan 5

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

然而,

GetMessage(&msg, NULL, WM_SPEVENT, WM_SPUUIEVENT)
Run Code Online (Sandbox Code Playgroud)

永远不会失败,永远不会回来-1.故障模式GetMessage&msg指无效内存,或第二个参数,窗口句柄无效.假设当然msg是正确定义的,这里都不会发生故障模式.通常它是一个局部变量,因此&msg总是很好.

Raymond Chen在这里介绍了这一点:GetMessage何时返回-1?