Я открываю элемент управления с помощью MSAA Server (Miscrosoft Active Accessibility), чтобы автоматизировать тестирование над ним с помощью Coded UI. Я использую MSAA, потому что код для VS2008, поэтому UI Automation недоступна.
Это работает хорошо, за исключением случая, когда в одном окне находятся два элемента управления. Проблема в сгенерированной иерархии пользовательского интерфейса. Это неправильно, но для случая, когда вы имеете дело с одним элементом управления, работает нормально.
Проблема с использованием примера с примером MSAA, найденного на SDK:
Образец сервера MSAA от Microsoft
Итак, когда я сопоставляю окно, я получаю правильную карту, но когда я сопоставляю элемент внутри списка, элемент правильный, но не отображается внутри списка:
Кодированная карта пользовательского интерфейса из сопоставления событий и утверждений
У меня точно такая же проблема в моем приложении.
Спасибо
Я исправил это используя статический std::map<string,int>
получить идентификатор при создании нового объекта.
Поэтому, когда создается новый объект, я запрашиваю статическую структуру с текущим заголовком окна (я знаю, что это рискованная операция, но она работает), и я получаю новый идентификатор.
Я возвращаю идентификатор, когда метод MSAA: IAccessible :: get_accValue вызывается
К этому свойству я добавляю свойство поиска значения coded-ui, и оно работает так, как я ожидал.
Вместо добавления и ответа на сообщение Windows: WM_GETOBJECT, я переопределил доступные методы из класса CWnd.
Проблема в том, что имя, возвращаемое get CWnd :: get_accName (VARIANT varID, BSTR * pszName), одинаково во всех chindrens окна, поэтому я немного изменил этот метод в своем классе, чтобы добавить дополнительную информацию для идентификации моего элемент.
И это работает.