0

出于某种原因,我在 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);
}
4

2 回答 2

3

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

于 2012-01-05T22:58:44.147 回答
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);
}
于 2013-07-31T09:44:39.947 回答