【问题标题】:UI Automation doesn't see hidden windows?UI 自动化没有看到隐藏的窗口?
【发布时间】:2013-10-29 19:18:19
【问题描述】:

我有已签名的 winforms 应用程序,并且清单具有 level="requireAdministrator" uiAccess="false"。
我想启动另一个带有隐藏窗口的应用程序并使用 UI 自动化 API 来处理它。

        Process procinst = new Process();
        procinst.StartInfo = new ProcessStartInfo()
        {
            WindowStyle = ProcessWindowStyle.Hidden,
            UseShellExecute = true,
            ErrorDialog = true,
            Verb = "runas",
            FileName = appfilepath
        };           
        procinst.Start();

在 Spy++ 中可以看到带有隐藏窗口的新进程,但在 UISpy 中看不到,我也无法使用 FindFirst 方法找到它:

mainwnd = AutomationElement.RootElement.FindFirst(TreeScope.Descendants, new PropertyCondition(AutomationElement.NameProperty, "apptitle"));

当 ProcessWindowStyle 被最小化时,一切都很好,当它被隐藏时 - 一切都停止了。
这是预期的 UI 自动化行为吗? UI 自动化无法访问隐藏窗口?有没有办法破解它?

【问题讨论】:

  • 您是否尝试过明确要求隐藏窗口?
  • 这是什么意思,明确的?我可以通过 FindFirst 或窗口处理程序访问窗口。 ShellExecuteEx 不返回窗口处理程序,所以我只有第一个选项。除此之外,隐藏的窗口不会在 UISpy 中显示。 UI 自动化设计可能不支持此类功能?
  • YES:您可以获得隐形窗口。枚举顶层窗口(例如使用 EnumWindows() 和 GetWindowThreadProcessId() 来检查窗口属于哪个进程),然后使用 AutomationElement.FromHandle() 获取自动化实​​例。

标签: automation ui-automation shellexecuteex


【解决方案1】:

根据 MSDN,“以编程方式隐藏”UI elements should not be in the UI Automation tree

特别是:

UIA_IsOffscreenPropertyId (30022) 标识 IsOffscreen 属性,它是一个布尔值,指示是否 自动化元素完全滚出视图(例如, 容器视口之外的列表框中的项目 对象)或折叠出视图(例如,树视图中的项目 或菜单,或在最小化的窗口中)。如果元素有可点击 可以使它获得焦点的点,元素是 当元素的一部分关闭时被认为在屏幕上 屏幕。属性的值不受遮挡的影响 其他窗口,或者根据元素是否在特定窗口上可见 监视器。如果 IsOffscreen 属性为 TRUE,则 UI 元素为 滚动到屏幕外或折叠。该元素暂时隐藏, 但它仍然存在于最终用户的认知中,并且继续存在 包含在 UI 模型中。对象可以通过以下方式重新显示在视野中 滚动、单击下拉菜单等。 最终用户的对象 根本不感知,或者“以编程方式隐藏”(对于 例如,已关闭的对话框,但下划线 对象仍由应用程序缓存)不应该在 首先是自动化元素树(而不是设置 IsOffscreen 的状态为 TRUE)。

【讨论】:

  • 就像你引用的那样,不可见的元素不会出现。但这取决于它在服务器端是如何实现的。例如 Firefox 返回很多不可见的 UIA 元素。它们只是有一个 0 x 0 像素的边界矩形。
  • @Elmue 然后我会争辩说 Firefox 的 UI 自动化实现很差,你应该在 Firefox 上打开一个错误。 (当然,您仍然需要解决它,但总的来说,UIA 的理念如上所述。)
  • 噢,那你就可以到处写错误报告了。此外,Microsoft 还实现了许多报告 0 x 0 像素大小的元素。例如,在 WPF ComboBox 中,下拉项是不可见的(大小 = 0x0 像素),直到显示 ComboBox 中的列表。同样在 WPF DataGrid 中,所有滚动到视图之外的项目的大小 = 0x0 像素。
【解决方案2】:

这很可悲,但这是真的:

UIA 中并没有真正意义上的“不可见”或“背景”元素——当一个元素消失时,它就不再出现在 UIA 树中。这对于辅助技术来说是一件好事(需要较少修剪树),但对于 UI 自动化框架来说可能会很麻烦。从历史上看,我们倾向于缓存 UI 元素,以便我们可以更快地再次返回它们。需要时,可以调用 ShowWindow 和 accSelect 与 SELFLAG_TAKEFOCUS 的混合。这不再有效。例如,如果一个工具窗口是选项卡而不是在前台;我们为它缓存的元素将因为无效,如果它被请求,我们需要 a) 将它带到前台 b) 再次从头开始查找元素。

WPF in Visual Studio 2010 – Part 6 : Automated UI Testing

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-01
    相关资源
    最近更新 更多