1

我有已签名的 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 自动化无法访问隐藏窗口?有没有办法破解它?

4

2 回答 2

1

根据 MSDN,“以编程方式隐藏”的 UI 元素不应出现在 UI 自动化树中。

尤其:

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

于 2013-10-27T21:32:56.630 回答
0

这很可悲,但这是真的:

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

Visual Studio 2010 中的 WPF – 第 6 部分:自动化 UI 测试

于 2013-10-29T11:18:19.580 回答