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