9

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

1.)

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

2.)

            Desktop.Instance.Windows();

两者都抛出 ArgumentException。请让我知道是否有其他方法可以做到这一点...

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

4

3 回答 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);
于 2012-04-17T20:54:22.533 回答
2

工作中的 UI 自动化项目使用:

List<White.Core.UIItems.WindowItems.Window> windows = WindowFactory.Desktop.DesktopWindows();
于 2012-05-01T20:27:28.117 回答
0

通过 FindAll 调用是不可能的。某些类型的窗口只能通过调用 FindWindow 才能使用。这些可能是 MMC 控制台的子窗口,此时 mmc 的主窗口被隐藏且 UI 自动化不可用。有没有办法让窗口所在的线程,以防窗口不是应用程序的主窗口?答案是枚举线程(通常需要管理权限)并计算出我们感兴趣的窗口属于哪个线程。

一般来说,似乎没有办法像 Spy++ 那样枚举所有窗口。例如,如果 UI 自动化搜索没有结果,Get-UIAWindow 只会调用 FindWindow。

于 2012-04-19T13:59:07.063 回答