我正在使用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);
}
答案 0 :(得分:6)
“...当我尝试更改第二个参数(hwnd),它将接收消息到我之前创建的窗口时,它不起作用。”
线程消息不会发送到窗口;它们被发布到具有NULL窗口句柄的线程消息队列中,并且不会被定制为特定窗口句柄的GetMessage()
循环拾取。
例如:PostQuitMessage()
发布帖子消息;不是窗口消息。你需要NULL。来自GetMessage()
文档:
如果hWnd为NULL,则GetMessage将检索属于当前线程的任何窗口的消息,以及当前线程的消息队列中hwnd值为NULL的任何消息(请参阅MSG结构)。因此,如果hWnd为NULL,则处理窗口消息和线程消息。