如何在关闭WPF模态窗口后将MFC对话框置于前台



我有一个MFC应用程序,通过COM接口发布消息,在c++中打开另一个进程上的窗体。该过程反过来使用ActiveX控件将消息传递到打开WinForm或WPF窗口(. net)。为了使新对话框成为子对话框,我正在传递原始MFC对话框的HWND。

到目前为止,一切都在工作,尽管WPF表单要求我禁用父窗口,除了通过windowstophelper设置所有者,当然在关闭时重新启用父窗口。

当我关闭表单时,我遇到的问题发生了。当我关闭WinForm时,原来的对话框变为活动的,但是当我关闭WPF表单时,任何先前有焦点的窗口都变为活动的。我可以重新激活我的MFC对话框的唯一方法是通过点击标题栏。

我已经尝试了十几种方法来尝试调用SetForegroundWindow,并检查以确保我的进程是当前的活动进程。如果我设置一个断点并继续,那么我的主对话框就会正常活动。

所以我现在通过将WPF窗口转换为UserControl并在(Win) Form中托管该控件来解决这个问题。

唯一的缺点是这个UserControl也在我的WPF应用程序中使用,所以我也有一个包含UserControl的WPF窗口。我只是创建了一个普通的Form,它在构造函数中接受控制,然后设置外观。这也意味着我能够摆脱为WPF窗口设置所有者和处理所有者启用状态的代码。

所以我打开窗口的代码是从:
MyWindow window = new MyWindow();
WindowInteropHelper helper = new WindowInteropHelper(window);
helper.Owner = owner;
EnableWindow(owner, false); // Platform Invoke
window.Closed += (s, e) => { EnableWindow(owner, true); };
window.ShowDialog();

,成为:

HostWinForm WinForm = new HostWinForm(new MyControl());
winForm.ShowDialog();

我不知道是否有一个解决方案,可以让我保持一个WPF窗口,并有我的模态行为,但这个解决方案适用于我。

最新更新