Я работаю над созданием окна с Win32 API, и у меня возникла проблема с этой частью:
GetMessage(&message, NULL, 0, 0);
Моя проблема в том, что когда я пытаюсь изменить второй параметр (hwnd
) который будет получать сообщения в окно, которое я сделал ранее, не работает; например, когда я пытаюсь закрыть окно, оно только прячется и не закрывается.
Вот полный код:
#include <windows.h>
LRESULT CALLBACK WinProc(HWND window, UINT message, WPARAM wParam, LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow)
{
WNDCLASS window;
window.cbClsExtra = NULL;
window.cbWndExtra = NULL;
window.hbrBackground = (HBRUSH)COLOR_BACKGROUND;
window.hCursor = LoadCursor(hInst, IDC_ARROW);
window.hIcon = NULL;
window.hInstance = hInst;
window.lpfnWndProc = WinProc;
window.lpszClassName = "WINDOW";
window.lpszMenuName = NULL;
window.style = CS_HREDRAW | CS_VREDRAW;
RegisterClass(&window);
HWND hwnd = CreateWindow("WINDOW", "Win32 Window Application", WS_OVERLAPPEDWINDOW | WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, 200, 200, NULL, NULL, hInst, NULL);
ShowWindow(hwnd, SW_SHOW);
UpdateWindow(hwnd);
MSG message;
while (GetMessage(&message, NULL, 0, 0))
{
TranslateMessage(&message);
DispatchMessage(&message);
}
return 1;
}
LRESULT CALLBACK WinProc(HWND window, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_CLOSE:
{
PostQuitMessage(0);
break;
}
default:
break;
}
return DefWindowProc(window, message, wParam, lParam);
}
«… когда я пытаюсь изменить второй параметр (hwnd), который будет получать сообщения в окно, которое я сделал ранее, это не сработает».
Сообщения потока не отправляются окну; они публикуются в очереди сообщений потока с дескриптором окна NULL и НЕ будут забираться с GetMessage()
цикл с учетом дескриптора окна.
Пример: PostQuitMessage()
отправляет нить сообщение; не оконное сообщение. Вам нужен NULL. От GetMessage()
документы:
Если hWnd равен NULL, GetMessage извлекает сообщения для любого окна, принадлежащего текущему потоку, и любых сообщений в очереди сообщений текущего потока, чье значение hwnd равно NULL (см. Структуру MSG). Поэтому, если hWnd NULL, оба сообщения окна и поток сообщений обрабатываются.