- 已关闭。**此问题为not reproducible or was caused by typos。当前不接受答案。
这个问题是由打字错误或无法再重现的问题引起的。虽然类似的问题在这里可能是on-topic,但这个问题的解决方式不太可能帮助未来的读者。
昨天关门了。
Improve this question
预期结果:窗口应可通过X按钮关闭,并使用0% CPU:
#include <Windows.h>
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg)
{
case WM_CLOSE:
PostQuitMessage(1);
break;
}
return DefWindowProc(hWnd, msg, wParam, lParam);
}
int CALLBACK WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow )
{
//Register Window class
const LPCWSTR pClassName = L"hw3dtutorial";
WNDCLASSEX wc = { 0 };
wc.cbSize = sizeof(wc);
wc.style = CS_OWNDC;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = nullptr;
wc.hCursor = nullptr;
wc.hbrBackground = nullptr;
wc.lpszMenuName = nullptr;
wc.lpszClassName = pClassName;
wc.hIconSm = nullptr;
RegisterClassEx(&wc);
//Create window instance
HWND hWnd = CreateWindowEx(
0,pClassName,
L"hw3d tutorial",
WS_CAPTION | WS_MINIMIZEBOX | WS_SYSMENU,
0, 0,
640, 480,
nullptr,nullptr,hInstance,nullptr
);
//Show... the... window
ShowWindow(hWnd, SW_SHOW);
MSG msg;
BOOL gResult;
while ( (gResult = GetMessage(&msg, nullptr, 0, 0)) > 0);
{
TranslateMessage(&msg);
DispatchMessage(&msg);
switch (gResult)
{
case -1:
return -1;
break;
default:
return msg.wParam;
break;
}
}
return 0;
}
实际行为:窗口挂起并占用线程。关闭按钮不起作用。
2条答案
按热度按时间sgtfey8w1#
您似乎没有处理邮件。您的
switch
中包含以下内容:所以不管
gResult
是什么,你都要退出循环。我认为你不应该从default
部分返回。zu0ti5jz2#
***已解决***1个小;导致应用程序在while循环中挂起。
while ((gResult = GetMessage(&msg, nullptr, 0, 0)) != 0) { /* etc */ }
,no;
您可能添加了额外的;
以解决DispatchMessage()
之后的switch
语句中的错误。删除该语句。- Hans Passant实际上,我根本没有注意到
;
,而是无意中添加了它,可能只是因为我在while()
中声明了一个变量,所以习惯将;
放在一行之后,这是一个新手错误。这一个
;
给了我无尽的悲伤,再次感谢汉斯帕森特!也感谢大家的回复。while ((gResult = GetMessage(&msg, nullptr, 0, 0)) > 0);
〈这一行中的;
导致这个循环没有按照我预期的方式执行,现在这个问题已经解决了。我还正确地设置了消息泵,它现在按照预期的方式工作。