AccExplorer не находит новые элементы управления / думает, что старые элементы управления все еще существуют

В нашем приложении много элементов управления, которые создаются динамически. Например, панель навигации содержит группы ссылок, которые меняются по мере того, как пользователь перемещается по приложению. В первый раз, когда я использую AccExplorer для выбора этих ссылок, он отлично их находит. Однако после того, как я перейду на другую страницу, AccExplorer не увидит ссылки в обновленной панели навигации. На самом деле, старые элементы управления ссылками по-прежнему отображаются в древовидной иерархии AccExplorer, и когда я нажимаю на них, AccExplorer выделяет области рабочего стола, которые находятся за пределами фактического окна нашего приложения.

Элементы управления изменились, но AccExplorer их не распознает. Он по-прежнему думает, что иерархия такая же.

Что мне кажется странным, так это то, что закрытие AccExplorer и последующее открытие нового экземпляра AccExplorer приводят к тем же результатам. Когда я выбираю новый элемент управления навигацией с помощью AccExplorer, он не видит новых ссылок. Он воссоздает старую иерархию со старыми ссылками. Единственный способ увидеть новые ссылки — закрыть наше приложение, снова открыть наше приложение, вручную перейти на новую страницу, а затем выбрать элементы управления с помощью AccExplorer.

Элемент управления навигацией — это элемент управления DevExpress. ОС WinXP. Акэксплорер 2.0. Я бы предпочел использовать UIAutomation, но не все элементы управления DevExpress поддерживают UIAutomation. Мы пытаемся использовать MSAA, чтобы заполнить эти пробелы.


person Community    schedule 18.08.2009    source источник


Ответы (1)


Следить за...

С помощью UISpy я могу найти элемент управления LeftNavExplorerBarGroups, который AccExplorer не видит. Я могу использовать UIAutomation, чтобы получить дескриптор окна элемента управления, а затем использовать дескриптор, чтобы найти объект IAccessible с помощью MSAALayer. Тот факт, что AccExplorer не может видеть этот элемент управления, а значение accName равно null, очень затрудняет поиск нужных мне элементов управления. (Примечание: MSAA исходит от Аршада — 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));
}
person Community    schedule 20.08.2009