gpt4 book ai didi

c++ - WM_CLOSE事件从不发送/接收?

转载 作者:行者123 更新时间:2023-12-02 10:30:10 32 4
gpt4 key购买 nike

我正在学习DX12,并在此过程中学习“旧版Win32”。
我在退出主循环时遇到问题,这似乎与我没有收到WM_CLOSE消息有关。
在C++,Windows 10控制台应用程序中。

#include <iostream>
#include <d3d12.h>
#include <dxgi1_4.h>
#include <tchar.h>

LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
return ::DefWindowProc(hWnd, msg, wParam, lParam);
}


int main()
{
std::cout << "Hello World!\n";

WNDCLASSEX wc = {
sizeof(WNDCLASSEX),
CS_CLASSDC,
WndProc,
0L, 0L,
GetModuleHandle(NULL),
NULL, NULL, NULL, NULL,
_T("ker engine"),
NULL
};

std::cout << "Registering Class\n";
::RegisterClassEx(&wc);

std::cout << "Creating Window\n";
HWND hwnd = ::CreateWindow(
wc.lpszClassName,
_T("Ker Engine DX12"),
WS_OVERLAPPEDWINDOW,
100, 100, 1280, 800, NULL, NULL,
wc.hInstance, NULL
);

std::cout << "Show Window\n";
::ShowWindow(hwnd, SW_SHOWDEFAULT);

std::cout << "Update Window\n";
::UpdateWindow(hwnd);

std::cout << "Entering main loop\n";
MSG msg;
ZeroMemory(&msg, sizeof(msg));

while (msg.message != (WM_QUIT))
{
if (::PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE))
{
::TranslateMessage(&msg);
::DispatchMessage(&msg);
std::cout << msg.message << std::endl;
switch (msg.message)
{
case WM_CLOSE:
std::cout << "close received\n";
::PostQuitMessage(0);
break;
}
continue;
}

}
std::cout << "leaving main loop\n";

std::cout << "Destroy Window\n";
::DestroyWindow(hwnd);
std::cout << "Unregister Class\n";
::UnregisterClass(wc.lpszClassName, wc.hInstance);
std::cout << "Bye\n";

return 0;
}
当我按下X(关闭)红色窗口按钮时,窗口关闭,但:
  • 未打印“已关闭收件”
  • 不打印
  • “离开主循环”。

  • 输出为:
    Entering main loop
    [a lot of message code, in decimal]
    160 (a lot of it) (WM_NCMOUSEMOVE)
    161 (WM_NCLBUTTONDOWN)
    275 (WM_TIMER)
    no more output printed, i have to close the console manually.
    没有WM_CLOSE,WM_DESTROY或WM_QUIT。在BUTTONDOW和应该使用的TIMER之间,应该有一个事件与关闭窗口有关,不是吗?
    我是初学者。我试图搜索google和stackoverflow,但是我不知道上下文是否适用于我,或者它太具体/无关。它可能是重复的,但我找不到。
    我是否正在丢失/跳过消息?这就是我能想到的。

    最佳答案

    多亏了Simon Mourier的评论和指向教程的链接,问题才得以解决。
    消息处理必须在WndProc中完成,而不是在“主循环”中完成。
    我要重新发布经过修改,清理,工作的代码:

    #include <iostream>
    #include <d3d12.h>
    #include <dxgi1_4.h>
    #include <tchar.h>

    LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
    {
    switch (msg)
    {
    case WM_CLOSE:
    std::cout << "close received\n";
    ::PostQuitMessage(0);
    return 0;
    }
    return ::DefWindowProc(hWnd, msg, wParam, lParam);
    }


    int main()
    {
    WNDCLASSEX wc = {
    sizeof(WNDCLASSEX),
    CS_CLASSDC,
    WndProc,
    0L, 0L,
    GetModuleHandle(NULL),
    NULL, NULL, NULL, NULL,
    _T("ker engine"),
    NULL
    };

    ::RegisterClassEx(&wc);

    HWND hwnd = ::CreateWindow(
    wc.lpszClassName,
    _T("Ker Engine DX12"),
    WS_OVERLAPPEDWINDOW,
    100, 100, 1280, 800, NULL, NULL,
    wc.hInstance, NULL
    );

    ::ShowWindow(hwnd, SW_SHOWDEFAULT);
    ::UpdateWindow(hwnd);

    MSG msg;
    ZeroMemory(&msg, sizeof(msg));
    while (msg.message != (WM_QUIT))
    {
    if (::PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE))
    {
    ::TranslateMessage(&msg);
    ::DispatchMessage(&msg);
    }
    }
    ::DestroyWindow(hwnd);
    ::UnregisterClass(wc.lpszClassName, wc.hInstance);

    return 0;
    }

    关于c++ - WM_CLOSE事件从不发送/接收?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62553819/

    32 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com