获取所有打开的 WPF 窗口

10

我试图获取所有打开的窗口。我尝试使用System.Windows.Application.Current.Windows,但在foreach循环所在的行中出现了空指针异常。有人知道哪里出了问题吗?

public Window getWindow(String Title)
{
    Window windowObject = null;
    Console.WriteLine("Inside getWindow");
    foreach (Window window in System.Windows.Application.Current.Windows)
    {
        if (window.Title == Title)
        {
            windowObject = window;
        }
    }
    return windowObject;
}

4
你有调试过吗?什么是 nullSystem.Windows.Application.Current.Windows 是什么?System.Windows.Application.Current 是什么? - Konrad Morawski
2
如果 ApplicationCurrentWindows 为空,您可以在该行前设置断点,在调试器中找到原因。 - Graham Clark
5
你的应用程序是WPF应用程序吗? - Frank Bollack
1
你可以使用 Process.GetProcesses 获取另一个进程的窗口句柄,然后使用 P/Invoke 向其发送消息。 - Raj Ranjhan
1
你不能这样做,它属于另一个AppDomain。 - Raj Ranjhan
显示剩余6条评论
3个回答

10

以下是在 WPF 中循环遍历所有已打开窗口的方法:

foreach (Window w in Application.Current.Windows)
{ 
    // TODO: write what you want here
}

如果你想在Windows表单中使用应用程序而不是App,请注意。 再见。


1
我并没有看到与问题中已有的代码相比有实质性的区别,除了语法糖。实际上,你的代码只有在你的项目中有一个派生自System.Windows.ApplicationApp类时才能工作。即使是这种情况,你也应该使用Application.Current来引用静态属性。 - tm1
这个问题涉及到WPF,我的回答也是关于WPF的,就这样。 - luka

4

当前的CurrentWindows为空

Windows属性只能从创建Application对象的线程中访问,在WPF应用程序中只有在应用程序对象被创建之后才能工作。


2
Window类如何应用于WinForms? - ken2k

0
请注意,System.Windows是一个命名空间,而Application是引用当前应用程序上下文的实际类。这意味着´Application.Current.Windows´仅引用应用程序本身生成的所有窗口。尝试循环遍历所有窗口并打印它们的标题。
在您的程序中,除非Title等于Application生成的窗口,否则if语句将始终为false,因此windowObject将保持为空,并且该方法将返回null。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接