Я занимаюсь разработкой программы по автоматизации графического интерфейса и столкнулся с принципиальной проблемой.
Для получения дерева контролов я использую IAccessible интерфейс. Всё прекрасно, но быстро выяснилось, что объекты не имеют никаких уникальных свойств, которые позволяли бы четко идентифицировать каждый конкретный контрол. То есть, прежде всего у них нет никакого уникального ID. Каждый элемент, фактически, имеет всего два свойства — Имя и Роль. Мало того, что имя может меняться, что оно может многократно повторятся внутри одного приложения, так оно еще может вообще быть пустым. Роль — тоже никак не является уникальной. Поэтому нет никакой возможности достоверное определить элемент!
А мне просто необходимо вести точный учет контролов и, более того, хранить всё дерево в базе данных для последующего его использования, при поиске маршрутов к тем или иным контролам.
Собственно, вопрос. Существет ли какая-то возможность идентификации? Хотя бы в рантайме.
Inspect.exe, среди прочих свойств объекта, показывает два поля:
RuntimeId
AnnotationID (в режиме MSAA)
Что это за айди такие? Откуда они берутся и как ими пользоваться? Я гуглил, но не смог найти вообще ничего по этому вопросу.
И еще, Inspect.exe работает в двух режимах: MSAA и UI Automation. В чем их различие??? Разве IAccessible — это не часть MSAA?