Автоматизация пользовательского интерфейса MSAA get_accChildCount неправильно возвращает 0 для Infragistics 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 идентифицировать дочерних элементов, поскольку на машине нет звуковой карты, но надеюсь, что скоро смогу это сделать. Я предполагаю, что Рассказчик найдет детей, и есть какой-то странный трюк, который я упускаю.


person Chiune Sugihara    schedule 10.09.2015    source источник
comment
Вы забыли вызвать CoInitializeEx().   -  person Hans Passant    schedule 30.05.2016


Ответы (2)


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


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


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

person Hansa    schedule 11.09.2015
comment
Я не могу изменить тестируемое приложение. Если бы я мог, я бы обновил код и использовал автоматизацию пользовательского интерфейса вместо MSAA, что, надеюсь, должно сработать. Однако реализация автоматизации в исходном коде — MSAA. Я изучил мост UI Automation to MSAA, но, к сожалению, он не предлагает той функциональности, которую я ищу. - person Chiune Sugihara; 23.02.2016

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

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

person Chiune Sugihara    schedule 23.02.2016