【问题标题】:Finding all windows on desktop using UIAutomation .NET使用 UIAutomation .NET 在桌面上查找所有窗口
【发布时间】:2016-05-25 15:38:21
【问题描述】:

我正在尝试使用 .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 调试代码时抛出异常。

【问题讨论】:

    标签: white-framework microsoft-ui-automation


    【解决方案1】:

    如果您想访问桌面的直接子元素,使用 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();
      

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-10-17
          • 2013-12-31
          • 1970-01-01
          • 2017-12-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多