根據MSDN Library中的GetMessage API,當出現錯誤時,它可能會返回-1。該文件提供常見錯誤的代碼段應被避免:將主消息循環中GetMessage()返回-1?
while (GetMessage(lpMsg, hWnd, 0, 0)) ...
文獻說:
的返回-1的可能性值 意味着這樣的代碼可導致致命 應用錯誤。相反,使用代碼 這樣的:
BOOL bRet;
while((bRet = GetMessage(&msg, hWnd, 0, 0)) != 0)
{
if (bRet == -1)
{
// handle the error and possibly exit
}
else
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
我的問題是,在每一個示例代碼,包括Visual Studio創建的默認應用程序,從微軟,主消息循環看起來如下:
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
注意上面的GetMessage的第二個參數是NULL。如果上面的代碼是有效的,這是否意味着GetMessage在這裏不會返回-1,所以處理-1的返回值是不必要的?
+1非常好說! – 2011-03-13 09:13:38
我從來沒有遇到麻煩,沒有檢查返回-1,但是當我看到文檔時,我很困惑。 現在,我堅持什麼文件說。而當GetMessage返回-1時ASSERT()。 – sam 2011-03-15 05:33:37
VS爲默認應用程序生成的代碼是正確的,因爲它不會傳遞任何過濾器並提供有效的'MSG *'參數。如果您閱讀['GetMessage'](http://msdn.microsoft.com/zh-cn/library/windows/desktop/ms644936.aspx)的文檔,則會明確指定這兩種錯誤模式。再往下看它的位置*「避免這樣的代碼:」*它顯示了一個帶有'HWND'過濾器的例子。其他錯誤模式是可能的,但這些都是災難性的,無論如何不能合理處理。或者如何從損壞的消息隊列中恢復?在這一點上,它是遊戲結束,2P UP。 – IInspectable 2013-08-07 19:19:59