0

我们的应用程序有许多动态创建的控件。例如,导航窗格包含在用户浏览应用程序时更改的链接组。我第一次使用 AccExplorer 选择这些链接时,它完美地找到了它们。但是,在我导航到另一个页面后,AccExplorer 在更新的导航窗格中看不到链接。事实上,旧的链接控件仍然出现在 AccExplorer 树层次结构中,当我单击它们时,AccExplorer 会突出显示超出我们应用程序实际窗口范围的桌面区域。

控件已更改,但 AccExplorer 无法识别它们。它仍然认为层次结构是相同的。

我觉得奇怪的是,关闭 AccExplorer 然后打开 AccExplorer 的新实例会产生相同的结果。当我使用 AccExplorer 选择新导航控件时,它看不到新链接。它使用旧链接重新创建旧层次结构。查看新链接的唯一方法是关闭应用程序,重新打开应用程序,手动导航到新页面,然后使用 AccExplorer 选择控件。

导航控件是一个 DevExpress 控件。操作系统是WinXP。AccExplorer 2.0。我更喜欢使用 UIAutomation,但并非所有 DevExpress 控件都支持 UIAutomation。我们正在尝试使用 MSAA 来填补这些空白。

4

1 回答 1

0

去跟随...

使用 UISpy,我可以找到 AccExplorer 看不到的名为 LeftNavExplorerBarGroups 的控件。我可以使用 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));
}
于 2009-08-20T23:00:07.557 回答