gpt4 book ai didi

c++ - 如何拦截消息: "WM_QUIT || WM_DESTROY || WM_CLOSE" WinAPI

转载 作者:太空狗 更新时间:2023-10-29 23:45:28 34 4
gpt4 key购买 nike

我将这段代码用于主循环(我的函数):

    while (running)
{
if(is_close)
{
Log().push_log("close", "message close!", logInfo);
running = active = false;

break;
}

while (PeekMessage(&msg, g_hWnd, 0, 0, PM_REMOVE))
{
std::cout << "Wnd: " << msg.message << std::endl;

if (msg.message == WM_QUIT || msg.message == WM_DESTROY || msg.message == WM_CLOSE)
{
MessageBox(0, "Hello, World", "Hello", MB_OK);
running = false;
}
// TranslateMessage(&msg);
DispatchMessage(&msg);
}

if (running && active)
render.DrawObject(g_hDC);
}

嗯,那我用WndProc:

LRESULT CALLBACK GLWindowProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
std::cout << "Wnd Proc: " << msg << std::endl;

return DefWindowProc(hWnd, msg, wParam, lParam);
}

当我试图在我的函数中获取消息 WM_QUITWM_DESTROYWM_CLOSE 时,它不起作用。我的函数看不到消息。

我怎样才能收到这条消息?

最佳答案

PeekMessage 或 GetMessage 将只返回使用 PostMessage() 发布到消息队列的消息。那永远不会是 WM_CLOSE 或 WM_DESTROY,这些消息是用 SendMessage() 发送的,直接传递给窗口过程,不进入消息队列。除非您的代码中有 PostQuitMessage() 调用,否则您不会收到 WM_QUIT,而您没有。

您确实必须为主窗口编写一个窗口过程。只需处理 WM_DESTROY 并调用 PostQuitMessage(0) 就足够了。

LRESULT CALLBACK GLWindowProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
if (msg == WM_DESTROY) PostQuitMessage(0);
return DefWindowProc(hWnd, msg, wParam, lParam);
}

您现在将在游戏循环中获得 WM_QUIT。

关于c++ - 如何拦截消息: "WM_QUIT || WM_DESTROY || WM_CLOSE" WinAPI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18827617/

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