UI自动化没有看到隐藏的窗口?

时间:2013-10-26 11:51:39

标签: automation ui-automation shellexecuteex

我有winforms已签名的应用程序,并且显示为level =“requireAdministrator”uiAccess =“false”。 我想用隐藏窗口启动另一个应用程序,并使用UI Automation 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自动化无法访问隐藏的窗口?有没有办法破解它?

2 个答案:

答案 0 :(得分:1)

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

特别是:

  

UIA_IsOffscreenPropertyId(30022)标识IsOffscreen   property,这是一个布尔值,表示是否   自动化元素完全滚动出视图(例如,一个   列表框中位于容器视口之外的项目   对象)或折叠出视图(例如,树视图中的项目)   或菜单,或在最小化的窗口中)。如果元素具有可点击性   可以使它接收焦点的点,元素是   当元素的一部分关闭时,被认为是在屏幕上   屏幕。该属性的值不受遮挡的影响   其他窗口,或者元素是否在特定的可见元素上可见   监控。如果IsOffscreen属性为TRUE,则UI元素为   在屏幕外滚动或折叠。该元素暂时隐藏,   但它仍然存在于最终用户的认知中并且仍然存在   包含在UI模型中。可以将对象带回到视图中   滚动,单击下拉列表,依此类推。 最终用户的对象   根本没有察觉,或者是“程序隐藏”(for   例如,一个已被解除的对话框,但是下划线   对象仍然由应用程序缓存)不应该在   自动化元素树首先(而不是设置   IsOffscreen的状态为TRUE)。

答案 1 :(得分:0)

这很难过,但那是真的:

  

在UIA中没有“隐形”或“背景”元素这样的东西 - 当元素消失时,它将不再位于UIA树中。这对于辅助技术来说是一件好事(不需要对树进行修剪),但对于UI自动化框架来说可能很麻烦。从历史上看,我们倾向于缓存UI元素,以便我们可以更快地再次回到它们。在需要时,可以使用SELFLAG_TAKEFOCUS调用ShowWindow和accSelect的混合。这不再有效。例如,如果工具窗口是标签而不是前景;我们的缓存元素将因为无效,如果它被请求我们需要a)将它带到前台并且b)再次从头开始找到元素。

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