2012-01-05 45 views
0

出於某種原因,我得到的GetMessage()循環結束後,「無效的窗口句柄」的錯誤直接,但我還沒有傳遞一個HWND它怎麼讓我得到這個錯誤? :■無效的窗口句柄後的GetMessage()循環

MSG Message; 
while(GetMessage(&Message, NULL, 0, 0) != 0) 
{ 
    TranslateMessage(&Message); 
    DispatchMessage(&Message); 
} 
ShowError(); 

這不是什麼不對ShowError我在用這比這個應用程序,並沒有得到這個錯誤...

void ShowError() 
{ 
    DWORD ErrorCode = GetLastError(); 
    if(ErrorCode == ERROR_SUCCESS) return; 

    LPTSTR lpszBuffer = NULL; 
    FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, ErrorCode, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&lpszBuffer, 0, NULL); 

    MessageBox(NULL, lpszBuffer, NULL, MB_OK | MB_ICONERROR); 
    LocalFree(lpszBuffer); 
} 

回答

3

你應該永遠只能調用GetLastError()的時候一個Windows函數返回一個失敗代碼。這當然不是在你的代碼段的情況下,你只測試了的GetMessage()的返回值!= 0。這可能是0,這表明你的程序與WM_QUIT正常停止。或者它可能是-1,這是一個真正的錯誤。

0

因爲我剛做了同樣的錯誤這裏是我的原因和解決方案。


原因:你的WndProc可能是導致該錯誤。當您關閉窗口 DefWindowProc函數最後一個錯誤設置爲1400 = 無效的窗口句柄如果使用 PostQuitMessage沒有「正確」。出現此錯誤時正在處理的消息可能是WM_NCLBUTTONDOWN。如果窗口已被銷燬,則不能點擊它。實際上有幾條消息不能被你的窗口處理。
解決方案:之後 PostQuitMessage沒有更多 DefWindowProc!只需返回你的結果代碼並退出WndProc。

// translated from C# 
LRESULT WndProc(HWND window, int msg, WPARAM wParam, LPARAM lParam) 
{ 
    if (msg == WM_CLOSE) 
    { 
     PostQuitMessage(0); 
     return 0; // comment this line to get the error again 
    } 
    return DefWindowProc(window, msg, wParam, lParam); 
}