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

时间:2014-08-15 14:44:13

标签: wpf mfc

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

到目前为止所做的一切都在起作用,尽管除了通过WindowInteropHelper设置所有者之外,WPF表单还要求我禁用父级,当然还要在关闭时重新启用父级。

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

我尝试过多种方法尝试调用SetForegroundWindow并检查以确保我的进程是当前活动进程。如果我将断点放入并继续,那么我的主对话框将正常激活。

1 个答案:

答案 0 :(得分:0)

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

唯一的缺点是这个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窗口并且也有我的模态行为,但这个解决方案适合我。