gpt4 book ai didi

c - DestroyWindow() 是否从消息队列中删除窗口的消息?

转载 作者:行者123 更新时间:2023-12-04 11:06:36 25 4
gpt4 key购买 nike

DestroyWindow()文档说明如下:

The function also destroys the window's menu, flushes the thread message queue,



“刷新线程消息队列”是否意味着它将从消息队列中删除我只想销毁的窗口的消息?

最佳答案

尽管文档对此并不明确,但它确实按照您的建议行事。发送到销毁窗口的消息被刷新,而其他窗口(或发送到线程)的消息保留在线程的队列中。

以下示例程序演示了这一点 - 如果您的建议为真,则不应触发任何断言(在我的测试中,它们不会触发)。

正如@HarryJohnston 在评论中指出的那样,销毁一个线程拥有的一个窗口并不会销毁该线程拥有的任何其他窗口(被销毁窗口的子窗口和拥有的窗口除外),因此如果他们发布的消息是删除,有效地无缘无故。

#include <windows.h>
#include <assert.h>

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
assert(message != WM_APP + 1);
return DefWindowProc(hWnd, message, wParam, lParam);
}

int APIENTRY wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow)
{
WNDCLASSEXW wcex{};
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.lpfnWndProc = WndProc;
wcex.hInstance = hInstance;
wcex.lpszClassName = L"msgflushtest";
assert(RegisterClassExW(&wcex));

HWND hWnd = CreateWindowEx(0, L"msgflushtest", nullptr, WS_POPUP, 0, 0, CW_USEDEFAULT, CW_USEDEFAULT,
HWND_DESKTOP, nullptr, hInstance, nullptr);
assert(hWnd);

assert(PostMessage(hWnd, WM_APP + 1, 0, 0)); // should be flushed
assert(PostThreadMessage(GetCurrentThreadId(), WM_APP + 2, 0, 0)); // should not be flushed

DestroyWindow(hWnd);

MSG msg;
assert(!PeekMessage(&msg, nullptr, WM_APP + 1, WM_APP + 1, PM_REMOVE));
assert(PeekMessage(&msg, nullptr, WM_APP + 2, WM_APP + 2, PM_REMOVE));

return 0;
}

关于c - DestroyWindow() 是否从消息队列中删除窗口的消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42567995/

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