使用UIAutomation .NET查找桌面上的所有窗口

9

我正试图使用.NET UIAutomation或White框架查找所有桌面窗口。我尝试过:

1.)

            AutomationElement rootElement = AutomationElement.RootElement;
            var winCollection = rootElement.FindAll(TreeScope.Subtree, Condition.TrueCondition);

2.)

            Desktop.Instance.Windows();

两个都会抛出ArgumentException异常。如果还有其他方法,请告诉我...

更新/回答:Desktop.Instance.Windows();可以正常工作,但在使用VS2010调试代码时会抛出异常。

3个回答

8
使用TreeScope.Children应该可以访问桌面的直接子元素::
    AutomationElement rootElement = AutomationElement.RootElement;
    var winCollection = rootElement.FindAll(TreeScope.Children, Condition.TrueCondition);

    foreach (AutomationElement element in winCollection)
        Console.WriteLine(element.Current.Name);

2

我在工作中负责一个UI自动化项目,使用了以下技术:

List<White.Core.UIItems.WindowItems.Window> windows = WindowFactory.Desktop.DesktopWindows();

0

通过FindAll调用是不可能的。有些类型的窗口只能通过调用FindWindow来获得。这些窗口可能是MMC控制台的子窗口,在mmc的主窗口隐藏且对UI自动化不可用的时候。 如果窗口不是应用程序的主窗口,有没有一种方法可以获取窗口所在的线程?答案是枚举线程(通常需要管理员权限),并计算我们感兴趣的窗口所属的线程。

通常,似乎没有可用的方法来枚举所有窗口,就像Spy++一样。例如,Get-UIAWindow如果UI自动化搜索失败,只会调用FindWindow。


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