GetMessage()循环后窗口句柄无效

时间:2012-01-05 22:38:33

标签: winapi window handle getmessage

出于某种原因,我在GetMessage()循环结束后直接得到“无效的窗口句柄”错误,但我甚至没有将HWND传递给它,所以我怎么得到这个错误? :■

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);
}

2 个答案:

答案 0 :(得分:3)

当Windows函数返回失败代码时,您应该只调用GetLastError()。在您的代码段中肯定不是这种情况,您只测试!= 0的GetMessage()返回值。这可能是0,表示您的程序使用WM_QUIT正常停止。或者它可能是-1,这是一个真正的错误。

答案 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);
}