#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行的代码。
答案 0 :(得分:2)
您已在窗口过程中使用WindowHandle
,然后将其设置为CreateWindowEx
的返回值。 CreateWindowEx
调用的一部分是使用WM_NCCREATE
和WM_CREATE
调用窗口过程。您的窗口过程在此时使用空句柄调用DefWindowProc
。
此处的简单解决方案是使用_windowHandle
参数代替WindowHandle
全局参数。
另请注意,为了让您的窗口可见,您需要拨打ShowWindow
。此外,您发布的退出邮件并非特定于该窗口,因此您的GetMessage
来电将无法检索,应用程序也不会结束。
答案 1 :(得分:0)
这里
DWORD err = GetLastError();
如果确实存在错误,您还没有测试过。在调用GetLastError之前,需要测试从CreateWindowEx返回的句柄。否则它将返回一些先前的,无关的错误或一些随机值。
答案 2 :(得分:0)
仅在CreateWindow失败后调用GetLastError(即,如果CreateWindow返回NULL)。
在绝大多数成功的Windows API调用之后,未指定最后一个错误值,您必须在调用GetLastError之前检查返回值。