我有一个MFC应用程序,它通过COM接口发布消息,在C++中的另一个进程上打开表单。然后,该进程使用ActiveX控件传递消息,以打开WinForm或WPF窗口(.NET)。我正在通过我原来MFC对话框的HWND,以便让新的对话框变成一个子对话框。
到目前为止,一切都在工作,尽管WPF表单除了通过WindowInteropHelper设置所有者之外,还要求我禁用父程序,当然,在关闭时重新启用父程序。
当我关闭表单时,就会出现问题。当我关闭WinForm时,原始对话框变为活动对话框,但当我关闭WPF表单时,任何在任何时间点具有焦点的窗口都会成为活动窗口。唯一可以重新激活MFC对话框的方法是单击标题栏。
我已经尝试了十几种方法尝试调用SetForegroundWindow,并检查以确保我的进程是当前的活动进程。如果我在其中放置一个断点并继续,那么我的主对话框就会正常活动。
发布于 2014-08-28 17:03:07
因此,我现在已经通过将WPF窗口转换为UserControl并以(Win)形式承载控件来解决这个问题。
唯一的缺点是这个UserControl也是从我的WPF应用程序中使用的,所以我也有一个包含UserControl的WPF窗口。我只是创建了一个简单的表单,它接受构造函数中的控件,然后设置外观。这也意味着我能够摆脱设置所有者和处理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窗口,也有我的模态行为,但这个解决方案对我有效。
https://stackoverflow.com/questions/25328548
复制相似问题