如果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)
如果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?