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

Winapi GetMessage()循环后的窗口句柄无效,winapi,window,handle,getmessage,Winapi,Window,Handle,Getmessage,由于某些原因,我在GetMessage()循环结束后直接得到“无效窗口句柄”错误,但我甚至没有向它传递HWND,所以为什么会出现此错误 MSG Message; while(GetMessage(&Message, NULL, 0, 0) != 0) { TranslateMessage(&Message); DispatchMessage(&Message); } ShowError(); 淋浴ROR没有任何问题,因为我不止在这个应用程序中使用它,而且

由于某些原因,我在GetMessage()循环结束后直接得到“无效窗口句柄”错误,但我甚至没有向它传递HWND,所以为什么会出现此错误

MSG Message;
while(GetMessage(&Message, NULL, 0, 0) != 0)
{
    TranslateMessage(&Message);
    DispatchMessage(&Message);
}
ShowError();
淋浴ROR没有任何问题,因为我不止在这个应用程序中使用它,而且没有出现这个错误

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

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

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

因为我刚才也有同样的错误,这里是我的原因和解决方案。
原因:您的WndProc可能导致此错误。关闭窗口时,
DefWindowProc
功能将最后一个错误设置为1400=无效窗口句柄,前提是您使用的
PostQuitMessage
不“正确”。出现此错误时正在处理的消息可能是WM_nClubuttonDown。如果窗口已被破坏,则无法处理对其的单击。事实上,有一些消息是您的窗口无法处理的。
解决方案:
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);
}

因为我刚刚犯了同样的错误,这里是我的原因和解决办法。
原因:您的WndProc可能导致此错误。关闭窗口时,
DefWindowProc
功能将最后一个错误设置为1400=无效窗口句柄,前提是您使用的
PostQuitMessage
不“正确”。出现此错误时正在处理的消息可能是WM_nClubuttonDown。如果窗口已被破坏,则无法处理对其的单击。事实上,有一些消息是您的窗口无法处理的。
解决方案:
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);
}