c++ WinMain()窗口挂起[关闭]

g2ieeal7  于 2023-02-10  发布在  其他
关注(0)|答案(2)|浏览(115)

这个问题是由打字错误或无法再重现的问题引起的。虽然类似的问题在这里可能是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;
}

实际行为:窗口挂起并占用线程。关闭按钮不起作用。

sgtfey8w

sgtfey8w1#

您似乎没有处理邮件。您的switch中包含以下内容:

switch (gResult)
{
case -1:
    return -1;
    break;
default:
    return msg.wParam;
    break;
}

所以不管gResult是什么,你都要退出循环。我认为你不应该从default部分返回。

zu0ti5jz

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);〈这一行中的;导致这个循环没有按照我预期的方式执行,现在这个问题已经解决了。我还正确地设置了消息泵,它现在按照预期的方式工作。

相关问题