如果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
}
}
答案 0 :(得分:5)
如果GetMessage
失败并返回-1
,那么通常您的第一个代码块确实会导致无限循环。因此,如果-1
是可能的返回值,那就是您看到第二个代码块形式的MSDN样本的原因。
然而,
GetMessage(&msg, NULL, WM_SPEVENT, WM_SPUUIEVENT)
永远不会失败,所以永远不会返回-1
。 GetMessage
的失败模式是&msg
引用无效内存,或第二个参数(窗口句柄)无效的地方。假设当然msg
被正确定义,这里都不会发生故障模式。通常它是一个局部变量,所以&msg
总是很好。
Raymond Chen在此处介绍了这一点:When will GetMessage return -1?