我们的应用程序有许多动态创建的控件。例如,导航窗格包含随用户在应用程序中导航而更改的链接组。我第一次使用AccExplorer来选择这些链接,它就能很好地找到它们。但是,在我导航到另一个页面后,AccExplorer无法在更新的导航窗格中看到链接。事实上,旧的链接控件仍然出现在AccExplorer树层次结构中,当我点击它们时,AccExplorer会突出显示桌面上超出应用程序实际窗口范围的区域。
控件已更改,但AccExplorer无法识别它们。它仍然认为层次结构是相同的。
我觉得奇怪的是,关闭AccExplorer然后打开一个新的AccExplorer实例会产生相同的结果。当我使用AccExplorer选择新的导航控件时,它看不到新的链接。它使用旧链接重新创建旧层次结构。查看新链接的唯一方法是,如果我关闭我们的应用程序,重新打开我们的应用程序,手动导航到新页面,然后使用AccExplorer选择控件。
导航控件是DevExpress控件。操作系统是WinXP。 AccExplorer 2.0。我更喜欢使用UIAutomation,但并非所有DevExpress控件都支持UIAutomation。我们正在尝试使用MSAA填补这些空白。
答案 0 :(得分:0)
跟进......
使用UISpy,我能够找到一个名为LeftNavExplorerBarGroups的控件,AccExplorer无法看到。我可以使用UIAutomation获取控件的窗口句柄,然后使用句柄通过MSAALayer查找IAccessible对象。 AccExplorer无法看到该控件并且accName为null这一事实使得很难发现如何找到我需要的控件。 (注意:MSAA来自Arshad - http://www.codeproject.com/KB/winsdk/MSAA_UI_Automation.aspx)
AutomationElement a, b;
Process p;
Process[] existingProcesses;
IAccessible c;
existingProcesses = Process.GetProcessesByName("OurApp");
if (existingProcesses.Length > 0) {
p = existingProcesses[0];
a = AutomationElement.FromHandle(p.MainWindowHandle);
b = a.FindFirst(TreeScope.Descendants, new PropertyCondition(AutomationElement.AutomationIdProperty, "LeftNavExplorerBarGroups"));
c = MSAA.GetAccessibleObjectFromHandle(new IntPtr(b.Current.NativeWindowHandle));
}