gpt4 book ai didi

c - Win32 应用程序中的窗口无法正常关闭

转载 作者:太空宇宙 更新时间:2023-11-04 05:36:50 25 4
gpt4 key购买 nike

原始问题:

尽管我的窗口过程函数能够检测到 WM_CLOSE 消息并调用 PostQuitMessage 并让 Windows 继续运行,但我有一个在创建后无法立即关闭的窗口使用 DefWindowProc 处理窗口消息。

但是,拖动标题栏移动窗口后,好像可以正常关闭。

我的窗口过程函数的代码如下:

LRESULT CALLBACK OnEvent(HWND handle, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_QUIT:
{
printf("WM_QUIT\n");
break;
}
case WM_CLOSE:
{
printf("WM_CLOSE\n");
PostQuitMessage(0);
return 0;
}
}
return DefWindowProc(handle, message, wParam, lParam);
}

所以除了将 WM_MOVE 消息发送到我的窗口或在 WM_CLOSE 案例 block 中使用 exit(0) 之外,我如何确保我的窗口创建后可以立即关闭吗?

新问题:

NULL 传递给 GetMessageWhWnd 参数后,窗口现在正常关闭,而不是我的窗口句柄,因此回答了我之前的问题.

因此,为什么 GetMessageW 函数以前没有使用提供的唯一窗口句柄检索 WM_QUIT 消息,而不是使用 NULL作为 hWnd 参数?

最佳答案

正确 编写的消息循环永远不会向窗口过程发送 WM_QUIT 消息,它只会在 GetMessage() 时中断循环当它收到 WM_QUIT 消息时返回 0:

GetMessage function

If the function retrieves a message other than WM_QUIT, the return value is nonzero.

If the function retrieves the WM_QUIT message, the return value is zero.

If there is an error, the return value is -1. For example, the function fails if hWnd is an invalid window handle or lpMsg is an invalid pointer. To get extended error information, call GetLastError.

响应 WM_CLOSE,您应该调用 DestroyWindow()而不是直接使用 PostQuitMessage()(DefWindowProc(WM_CLOSE) 的默认行为是为您调用 DestroyWindow())。您需要一个 WM_DESTROY 处理程序,然后调用 PostQuitMessage():

LRESULT CALLBACK OnEvent(HWND handle, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_CLOSE:
{
printf("WM_CLOSE\n");
DestroyWindow(handle);
return 0;
}

case WM_DESTROY:
{
printf("WM_DESTROY\n");
PostQuitMessage(0);
return 0;
}
}
return DefWindowProc(handle, message, wParam, lParam);
}

这在 MSDN 上有记录:

Closing the Window

这是该页面的流程图:

flow chart

关于 GetMessage() 问题,如果您阅读 GetMessage() 的文档和 PostQuitMessage()更仔细一点,您会发现 PostQuitMessage() 发送的 WM_QUIT 消息不是 window 消息。将非 NULL HWND 传递给 GetMessage() 只会从 PostMessage()SendMessage() 检索消息适用于特定的 HWND 1GetMessage() 将忽略任何不适合该 HWND 的消息,其中包括来自 PostThreadMessage()thread 消息> 和 PostQuitMessage()。将 NULL HWND 传递给 GetMessage() 允许它返回任何未决消息,包括 WM_QUIT

1 这样做很危险,顺便说一句:The dangers of filtering window messages

关于c - Win32 应用程序中的窗口无法正常关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32803656/

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