Почему ошибка 1400 Неверный дескриптор окна?

#include <stdio.h>
#include <stdbool.h>
#include <Windows.h>

HWND WindowHandle;
HINSTANCE Instance;
const wchar_t WindowClassName[] = L"Temp Projcet";

LRESULT CALLBACK WindowProc(HWND _windowHandle, UINT _msg, WPARAM _param, LPARAM _param1) {
switch (_msg) {
case WM_PAINT: {
PAINTSTRUCT ps;
HDC hdc = BeginPaint(WindowHandle, &ps);
FillRect(hdc, &ps.rcPaint, (HBRUSH)(COLOR_WINDOW + 1));
EndPaint(WindowHandle, &ps);
} break;
case WM_CLOSE: {
if (IDOK == MessageBoxW(WindowHandle, L"Quit?", L"My application", MB_OKCANCEL)) {
DestroyWindow(WindowHandle);
}
return false;
} break;
case WM_DESTROY: {
PostQuitMessage(0);
} break;
default:
break;
}
return DefWindowProcW(WindowHandle, _msg, _param, _param1);
}

ATOM RegisterWindowClass(void) {
WNDCLASS wc = { 0 };
wc.lpfnWndProc = WindowProc;
wc.hInstance = Instance;
wc.lpszClassName = WindowClassName;
return RegisterClassW(&wc);
}

int APIENTRY wWinMain(HINSTANCE _instance, HINSTANCE _prevInstance, PWSTR _cmdLine, int _cmdShow) {
Instance = _instance;
RegisterWindowClass();

WindowHandle = CreateWindowExW(
0,
WindowClassName,
L"This a window",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
NULL,
NULL,
Instance,
NULL
);

DWORD err = GetLastError();
// Why error 1400 Invalid window handle?

MSG msg = { 0 };
while (GetMessageW(&msg, WindowHandle, 0, 0)) {
TranslateMessage(&msg);
DispatchMessageW(&msg);
}

return 0;
}

Почему при создании окна возвращается 1400 недействительных дескрипторов? Не так ли? В функции создания окна нет дескриптора окна, хорошо? Как это может быть неверный дескриптор? Я долго искал в поисковике, но до сих пор не могу решить эту проблему?
Почему CreateWindowExW() вернуть 1400?
Код в строке 44.

1

Решение

Вы используете WindowHandle в процедуре окна, прежде чем он был установлен на возвращаемое значение CreateWindowEx, Часть этого CreateWindowEx вызов вызывает оконную процедуру с WM_NCCREATE а также WM_CREATE, Ваша оконная процедура вызывает DefWindowProc с нулевой ручкой в ​​этой точке.

Простое решение здесь заключается в использовании _windowHandle параметр вместо вашего WindowHandle Глобальный.

Также обратите внимание, что для того, чтобы ваше окно было видно, вам нужно позвонить ShowWindow, Кроме того, сообщение о выходе, которое вы публикуете, не относится к этому окну, поэтому ваш GetMessage вызов не получит его, и приложение не будет завершено.

2

Другие решения

Вот

DWORD err = GetLastError();

Вы не проверяли, действительно ли произошла ошибка. Вам нужно проверить дескриптор, который вы получаете от CreateWindowEx, прежде чем вызывать GetLastError. В противном случае он вернет некоторую предыдущую, не связанную ошибку или какое-либо случайное значение.

0

Вызывайте GetLastError только после неудачного CreateWindow (то есть, если CreateWindow возвращает NULL).

последнее значение ошибки не указывается после подавляющего большинства успешных вызовов Windows API, необходимо проверить возвращаемое значение перед вызовом GetLastError.

0
По вопросам рекламы [email protected]