2015-09-10 2 views
0

При работе над автоматизацией управления Infragistics UltraTree в приложении C# Winforms я обнаружил, что UltraTree реализовала модель AccessibleObject (MSAA). Я был в состоянии успешно захватить IAccessible интерфейс, поместив HWND схватил из шпиона ++ вMSAA UI Automation get_accChildCount Неправильно возвращает 0 для Infragistics UltraTree в Winforms

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

+0

Вы забыли [называть CoInitializeEx()] (http://stackoverflow.com/a/37505609/17034). –

ответ

0

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

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

1

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


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


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

+0

Я нахожусь не смог изменить тестируемое приложение.Если я мог бы затем обновить код и использовать UI Automation вместо MSAA, который, как мы надеемся, будет работать. Реализация автоматизации в исходном коде, хотя и является MSAA.Я рассмотрел мост UI Automation для MSAA, но не кажется, что он предлагает функциональность, которую я ищу, к сожалению. –

Смежные вопросы