Неверный дескриптор окна после цикла GetMessage () - PullRequest
0 голосов
/ 06 января 2012

По какой-то причине я получаю ошибку «Недопустимый дескриптор окна» сразу после завершения цикла GetMessage (), но я даже не передаю ему HWND, так почему же я получаю эту ошибку? : S

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 ]

3 голосов
/ 06 января 2012

Вы должны когда-либо вызывать GetLastError (), только когда функция Windows вернула код ошибки. Это, конечно, не тот случай в вашем фрагменте, вы проверяете только возвращаемое значение GetMessage () для! = 0. Это может быть 0, указывая, что ваша программа остановилась нормально с WM_QUIT. Или это может быть -1, настоящая ошибка.

0 голосов
/ 31 июля 2013

Так как у меня была та же самая ошибка, вот моя причина и решение.


Причина: Вероятно, эта ошибка вызвана вашим 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);
}
...