我有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自动化无法访问隐藏的窗口?有没有办法破解它?
答案 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)再次从头开始找到元素。