C++ MFC,如何从主窗口关闭模式对话框?

C++ MFC,如何从主窗口关闭模式对话框?,c++,multithreading,winapi,mfc,C++,Multithreading,Winapi,Mfc,我们有一个对话框X,可以由不同的线程(也是主线程)作为模式打开。多模式X对话框,同时来自不同线程是可能的 如果主窗口处理SC\u close消息,我们希望关闭所有X(仅X)模式对话框 问题是,;在主窗口中,当收到SC\u close消息时,如何关闭所有模态X对话框?仅限X!因此,PostQuitMessage没有帮助,因为它会关闭整个应用程序,如果其他模式对话框如Y,Z…打开,我们不想关闭该应用程序 信息:主窗口可以处理SC_CLOSE消息,当我们从主线程以及其他线程打开了模态X对话框时。而且X

我们有一个对话框
X
,可以由不同的线程(也是主线程)作为模式打开。多模式
X
对话框,同时来自不同线程是可能的

如果主窗口处理
SC\u close
消息,我们希望关闭所有
X
(仅
X
)模式对话框

问题是,;在主窗口中,当收到
SC\u close
消息时,如何关闭所有模态
X
对话框?仅限
X
!因此,
PostQuitMessage
没有帮助,因为它会关闭整个应用程序,如果其他模式对话框如
Y,Z…
打开,我们不想关闭该应用程序


信息:主窗口可以处理
SC_CLOSE
消息,当我们从主线程以及其他线程打开了模态
X
对话框时。而且
X
没有子模式窗口。

我当前的解决方案是

在打开所有模态
X
对话框的过程中,它们都已注册到一个集合中(线程安全)。 如果主窗口变成
SC\u CLOSE
-消息,则现在可以迭代所有对话框。然后对每个对话框使用这两行中的一行

  ::PostMessage(pDlg->GetSafeHwnd(), WM_COMMAND, IDOK, 0); //end dialog with idok
  ::PostMessage(pDlg->GetSafeHwnd(), WM_CLOSE, 0, 0);      //or, close dialog
我知道这不是最好的解决办法,但希望能帮助别人


不要试图迭代主窗口的所有子窗口来查找对话框。这没用。对话框的所有者并不意味着它是对话框的父对象。

“是的,在技术上是合法的。玩电锯在技术上也是合法的。”@IInspectable我们的对话框就像一个消息框,所以我们没有真正的管理问题。我的问题看起来像:,但我不想关闭
X
-dialog。您不理解这个问题。您使用的是一个模式对话框,其中的所有者窗口由另一个线程拥有。仅当您为了安全而专门实施此方案时,才支持此方案。由于您使用的是MFC,这是不可能的,因为您无法访问消息调度代码。这被烘焙到MFC实现中。你所做的是不安全的,也不能保证安全。@i你是对的,但总有一些事情我永远无法改变:)。我不能再改变设计了。我正在开发一个有20年历史的软件。直到今天,由于安全原因,我们还从未遇到过问题。看起来,不同的线程显示一个定制的messagebox。可能所有
X
-对话框都可以以线程安全的方式在静态全局集合中注册,那么我可以关闭这些对话框吗?
WM\u close
是单击关闭按钮时发送的消息,而不是
SC\u close
。你也可以自己寄。当然,因为您有一个多线程设置,我不确定如果您告诉messagebox在任何给定点关闭会发生什么。。。