0

Microsoft 有一篇知识库文章描述了如何修改 ATL .exe 中的消息循环,以便无模式对话框可以接收适当的消息。

如果您可能有多个无模式对话框,并且您不知道在任何给定时间可能存在哪些对话框,我想知道如何优雅地做到这一点。就像 .exe 可能托管几个不同的 COM 类一样,每个类都有不同的对话框,谁知道可能会实例化哪一个。

您是否会创建一个全局 hwnd 集,并让每个对话框类在创建时将其 hwnd 放在集合中,然后让消息循环遍历集合调用IsDialogMessage(and TranslateAccelerator)?

4

2 回答 2

1

WTL 对这个挑战的解决方案是有一个专门的消息循环类,它在静态容器中注册自己,以便对话可以发现它们所属线程的消息循环。

对话框可以通过这些消息循环注册自己,CMessageLoop::AddMessageFilter并在翻译消息时调用它们的回调。

示例

    // register object for message filtering and idle updates
    CMessageLoop* pLoop = _Module.GetMessageLoop();
    ATLASSERT(pLoop != NULL);
    pLoop->AddMessageFilter(this);
    pLoop->AddIdleHandler(this);
于 2021-04-25T07:37:53.417 回答
0

消息指定了它的目标(可能是实际对话框的子对象),我将通过一组对话框指针来处理这个问题,然后简单地使用 IsChild() 迭代每个测试集,并且只有在找到正确的对话框 HWND 时才会我使用 IsDialogMessage。

另一种方法是从 MSG 中的 HWND 向上走祖先树,以某种方式将 HWND 转换为对象,当您到达一个对话框窗口时,使用 IsDialogMessage。

于 2021-04-24T20:42:18.653 回答