2014-10-07 98 views
3

如果GetMessage(...)失敗,消息是否不會從消息隊列中刪除?我問,因爲當我有下面的循環,我最終將進入一個無限循環試圖一遍又一遍處理同樣的消息: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 
    } 

} 

回答

5

如果GetMessage失敗並返回-1,那麼通常你的第一個代碼塊確實會導致一個無限循環的正確方法。所以,如果-1是一個可能的返回值,那就是爲什麼你會看到第二個代碼塊形式的MSDN樣本。

然而,

​​

永遠不會失敗,因此永遠不會返回-1GetMessage的故障模式是&msg引用了無效內存,或者第二個參數窗口句柄無效。這兩種失效模式都不會發生,假設msg已被正確定義。通常它是一個局部變量,所以&msg總是很好。

Raymond Chen在這裏覆蓋:When will GetMessage return -1?

+0

這非常有道理。 Raymond Chen的這一點也是一個很好的資源 - 謝謝! – phillythompson 2014-10-07 14:54:03

相關問題