如果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)
永远不会失败,因此永远不会返回
-1
。 GetMessage
的失败模式是&msg
引用无效的内存,或者第二个参数(窗口句柄)无效。当然,假设正确定义了msg
,这两种故障模式都不会发生。通常,它是一个局部变量,因此&msg
总是可以的。雷蒙德·陈(Raymond Chen)在此处介绍了此内容:When will GetMessage return -1?