【发布时间】:2013-01-26 14:43:03
【问题描述】:
我正在尝试使用 Win32 API 创建一个非常基本的窗口,但我已经很久没有这样做了。
我认为我的消息循环没问题,但是当我关闭打开的窗口时,应用程序仍在运行。看起来消息循环永远不会收到WM_QUIT 消息。但是,我打电话给PostQuitMessage,一个消息框确认我打电话给它。
这个极简代码有什么问题?
#include <Windows.h>
LRESULT CALLBACK window_proc(HWND hwnd, UINT msg,
WPARAM w_param, LPARAM l_param) {
switch (msg) {
case WM_DESTROY:
MessageBox(NULL, L"destroy", L"info", MB_OK);
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, msg, w_param, l_param);
}
return 0;
}
int CALLBACK WinMain(HINSTANCE h_instance, HINSTANCE h_prev_instance,
LPSTR cmd_line, int n_cmd_show) {
WNDCLASS wnd_class;
HWND hwnd;
MSG msg;
BOOL ret;
wnd_class.cbClsExtra = 0;
wnd_class.cbWndExtra = 0;
wnd_class.hbrBackground = (HBRUSH) GetStockObject(BLACK_BRUSH);
wnd_class.hCursor = LoadCursor(NULL, IDC_ARROW);
wnd_class.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wnd_class.hInstance = h_instance;
wnd_class.lpfnWndProc = window_proc;
wnd_class.lpszClassName = L"MyWindowClass";
wnd_class.lpszMenuName = NULL;
wnd_class.style = 0;
if (!RegisterClass(&wnd_class)) {
MessageBox(NULL, L"cannot register window class",
L"error", MB_OK | MB_ICONERROR);
}
hwnd = CreateWindow(
L"MyWindowClass",
L"",
WS_OVERLAPPEDWINDOW | WS_VISIBLE,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
h_instance,
NULL
);
while ((ret = GetMessage(&msg, hwnd, 0, 0)) != 0) {
if (ret == -1) {
MessageBox(NULL, L"error", L"", MB_OK);
} else {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
MessageBox(NULL, L"quitting now", L"info", MB_OK);
return msg.wParam;
}
GetMessage 文档说函数在读取WM_QUIT 消息时返回 0。怎么会调用PostQuitMessage 而GetMessage 永远不会返回0?
谢谢你,Win32 大师。
【问题讨论】:
-
@KenWhite 传统上,
WM_CLOSE调用DestroyWindow(),它发送WM_DESTROY,您的处理程序调用PostQuiteMessage(),它将WM_QUIT 发布到线程消息队列,导致GetMessage()返回0。这就是他首先来到这里的原因。我唯一觉得奇怪的是WM_DESTROY处理程序中的消息框。如果我面前有一个 windows 盒子,我会试试这个,因为它一定是一个太简单的问题。 -
@KenWhite,根据Microsoft documentation“它通常用于响应 WM_DESTROY 消息。”
-
@MarkRansom 我同意(希望在之前的评论中很明显)。
-
@WhozCraig 和@MarkRansom:知道了。我读的是
remarks,而不是主题。删除我的 cmets。感谢您的更正 - 我不得不做这些事情已经太久了。 :-) -
@eepp 想我明白了。发布传入(没有双关语)。