【发布时间】:2019-04-26 09:39:02
【问题描述】:
所以我有多个窗口正在运行,我想为所有窗口处理消息,这样它们就不会挂起。到目前为止,我已经尝试了多种方法:
1) 把它变成一个线程(有点愚蠢,但我试过了):
auto ProcessThread(
std::vector<HWND> Windows
) -> void
{
for (;;)
{
MSG Msg1 = decltype(Msg1){0x00};
MSG Msg2 = decltype(Msg2){0x00};
GetMessageW(&Msg1, Windows.at(0), 0, 0);
GetMessageW(&Msg2, Windows.at(1), 0, 0);
TranslateMessage(&Msg1);
TranslateMessage(&Msg2);
DispatchMessageW(&Msg1);
DispatchMessageW(&Msg2);
}
return;
}
...
std::vector<HWND> Windows = { lpScreen.m_WindowHandle, lpPopup.m_WindowHandle };
HANDLE hThread = CreateThread(nullptr, 0, reinterpret_cast<LPTHREAD_START_ROUTINE>(ProcessThread),
&Windows, 0, nullptr);
while (WAIT_TIMEOUT == WaitForSingleObject(hThread, 1000)) {}
CloseHandle(hThread);
2) 只是填充第二个消息循环
MSG Msg1 = decltype(Msg1){0x00};
MSG Msg2 = decltype(Msg2){0x00};
while (GetMessageW(&Msg1, Hwnd1, 0, 0) && GetMessageW(&Msg2, Hwnd2, 0, 0))
{
TranslateMessage(&Msg1);
TranslateMessage(&Msg2);
DispatchMessageW(&Msg1);
DispatchMessageW(&Msg2);
}
3) 第二个的其他变体
到目前为止,所有这些都使我的窗口无法移动,并给了我加载光标。
有什么想法吗?
【问题讨论】:
-
考虑到
GetMessageblocks 第二种选择有点缺陷。 -
要接收所有窗口的消息,只需不要过滤。要了解该代码损坏的原因,请参阅The dangers of filtering window messages。
-
我不明白 "it" 是什么或 "防止被卡住" 应该是什么意思。您当然希望您的消息循环为所有窗口以及线程消息调度 all 消息(
WM_QUIT是后者的一个突出示例)。如果您需要GetMessage的非阻塞版本,请使用PeekMessage,如果您需要等待其他可等待对象,请使用MsgWaitForMultipleObjects。 -
在所有初学者教程中发现的标准、简单的消息循环服务于多个窗口。如果您需要帮助解决代码中的问题,您必须首先明确该问题是什么。由于我们其他人很乐意管理具有多个窗口的应用程序,显然您正在做一些不同的事情。但是什么?
-
您睡眠不足的事实与我们无关,实际上使您的问题黯然失色。我们不是来为那些为什么不管理他们的时间和截止日期的人提供一对一的个人支持。如果您找不到时间睡觉(或者确实无法学习 Win32 GUI 编程的基础知识),那是您的问题,而不是我们的问题。这是一个提供对其他访问者有用的问题的网站。再次阅读您发布的内容,并问问自己是否认为它符合该描述。其他对您有用的资源:@987654324@ 和 tour。