You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 20:16:11