如何在WinForm应用中获取已打开的WPF窗口列表?
在WinForm项目中获取已打开的WPF窗口列表
WinForm项目默认不会自动初始化WPF的Application实例,这就是你无法直接使用Application.Current.Windows的原因。以下是两种可行的解决方案:
方案1:初始化WPF Application实例
在首次打开WPF窗口前,检查并初始化WPF的Application对象,之后就能像原生WPF项目一样使用Application.Current.Windows获取窗口列表:
// 确保WPF Application实例已初始化 if (System.Windows.Application.Current == null) { new System.Windows.Application(); } // 获取所有已打开的WPF窗口 var openWpfWindows = System.Windows.Application.Current.Windows .Cast<System.Windows.Window>() .Where(w => w.IsVisible); // 可选:过滤掉隐藏的窗口
初始化后,所有通过Show()打开的WPF窗口都会自动被纳入Application.Current.Windows集合管理。
方案2:手动维护窗口列表
如果不想依赖WPF的全局Application实例,可以自行维护一个静态集合来跟踪所有WPF窗口,创建时添加、关闭时移除:
// 定义静态集合存储WPF窗口 private static readonly List<System.Windows.Window> _trackedWpfWindows = new List<System.Windows.Window>(); // 创建并显示WPF窗口的代码 WpfWindow win = new WpfWindow(); System.Windows.Forms.Integration.ElementHost.EnableModelessKeyboardInterop(win); WindowInteropHelper helper = new WindowInteropHelper(win); helper.Owner = this.Handle; // 将窗口加入集合,并注册关闭事件移除 _trackedWpfWindows.Add(win); win.Closed += (sender, e) => _trackedWpfWindows.Remove(sender as System.Windows.Window); win.Show(); // 获取当前打开的WPF窗口列表 var openWpfWindows = _trackedWpfWindows.ToList(); // 用ToList避免遍历过程中集合被修改
这种方式更灵活,适合需要精细化控制窗口生命周期的场景。
内容的提问来源于stack exchange,提问作者Mike97
相关产品推荐
相关产品推荐

