Кодированная иерархия пользовательского интерфейса и MSAA

Я открываю элемент управления с помощью MSAA Server (Miscrosoft Active Accessibility), чтобы автоматизировать тестирование над ним с помощью Coded UI. Я использую MSAA, потому что код для VS2008, поэтому UI Automation недоступна.

Это работает хорошо, за исключением случая, когда в одном окне находятся два элемента управления. Проблема в сгенерированной иерархии пользовательского интерфейса. Это неправильно, но для случая, когда вы имеете дело с одним элементом управления, работает нормально.

Проблема с использованием примера с примером MSAA, найденного на SDK:

Образец сервера MSAA от Microsoft

Итак, когда я сопоставляю окно, я получаю правильную карту, но когда я сопоставляю элемент внутри списка, элемент правильный, но не отображается внутри списка:

Кодированная карта пользовательского интерфейса из сопоставления событий и утверждений

У меня точно такая же проблема в моем приложении.

Спасибо

0

Решение

Я исправил это используя статический std::map<string,int> получить идентификатор при создании нового объекта.

Поэтому, когда создается новый объект, я запрашиваю статическую структуру с текущим заголовком окна (я знаю, что это рискованная операция, но она работает), и я получаю новый идентификатор.

Я возвращаю идентификатор, когда метод MSAA: IAccessible :: get_accValue вызывается

К этому свойству я добавляю свойство поиска значения coded-ui, и оно работает так, как я ожидал.

0

Другие решения

Вместо добавления и ответа на сообщение Windows: WM_GETOBJECT, я переопределил доступные методы из класса CWnd.

Проблема в том, что имя, возвращаемое get CWnd :: get_accName (VARIANT varID, BSTR * pszName), одинаково во всех chindrens окна, поэтому я немного изменил этот метод в своем классе, чтобы добавить дополнительную информацию для идентификации моего элемент.

И это работает.

0