MSAA UI Automation get_accChildCount неправильно возвращает 0 для инфраструктуры UltraTree в Winforms

Работая над автоматизацией элемента управления Infragistics UltraTree в приложении C # Winforms, я обнаружил, что в UltraTree реализована модель AccessibleObject (MSAA). Я смог успешно захватить интерфейс IAccessible, поместив hwnd, захваченный из spy ++ в

IAccessible* accessibleObject;
AccessibleObjectFromWindow(hwnd, OBJID_CLIENT, IID_IAccessible, (void**)&accessibleObj);

Проблема в том, что когда я сейчас звоню

long childCount;
accessibleObj->get_accChildCount(&childCount);

Результат, который я получаю, равен нулю. Посмотрев исходный код UltraTree, я заметил, что его реализация дочерних счетчиков не должна возвращать ноль (проверяется с помощью windbg для проверки полей, используемых во внутреннем коде). Кажется, что все другие функции MSAA работают правильно (например, «accLocation»).

Я в тупик, почему это так. Я также попытался использовать ‘IEnumVARIANT’, но он также не нашел дочерних элементов, даже если у дерева есть 25 элементов в коллекции, которую использует get_accChildCount. Я еще не пытался выяснить, смог ли Microsoft Narrator идентифицировать детей, поскольку на машине нет звуковой карты, но надеюсь, что в ближайшее время удастся его настроить. Я предполагаю, что Рассказчик найдет детей, и есть одна странная уловка, которую мне не хватает.

0

Решение

У меня была такая же проблема для контроля инфраструктуры.
Если вы можете изменить тестируемое приложение, у вас есть 2 варианта, в противном случае я думаю, что нет никакого решения, и вы попали в ловушку.


а) переопределить реализацию AutomationPeer вашего UltraTree, поэтому просто создайте свое собственное CustomizedUltraTree. Вот полезная ссылка на эту тему Docu


б) обратитесь в службу поддержки клиентов Infragistics, для меня это была просто проблема с версиями, и они были довольно быстрыми и уверенными.

1

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

Что-то вроде грубого ответа, но в итоге я обнаружил, что при запуске под CLR (переворачивание / включение) возвращается правильное количество детей. Таким образом, буквально тот же самый точный код, с той лишь разницей, что указан или нет ключ компилятора / clr. Я действительно не хочу запускать этот код под CLR, хотя это не идеальное решение для меня, но оно технически отвечает на мой вопрос.

Мне нужно будет опубликовать еще один вопрос, спрашивающий, почему это может происходить 🙁

0

По вопросам рекламы [email protected]