Добрый день.
Я занимаюсь разработкой программы по автоматизации графического интерфейса и столкнулся с принципиальной проблемой.
Для получения дерева контролов я использую IAccessible интерфейс. Всё прекрасно, но быстро выяснилось, что объекты не имеют никаких уникальных свойств, которые позволяли бы четко идентифицировать каждый конкретный контрол. То есть, прежде всего у них нет никакого уникального ID. Каждый элемент, фактически, имеет всего два свойства — Имя и Роль. Мало того, что имя может меняться, что оно может многократно повторятся внутри одного приложения, так оно еще может вообще быть пустым. Роль — тоже никак не является уникальной. Поэтому нет никакой возможности достоверное определить элемент!
А мне просто необходимо вести точный учет контролов и, более того, хранить всё дерево в базе данных для последующего его использования, при поиске маршрутов к тем или иным контролам.
Собственно, вопрос. Существет ли какая-то возможность идентификации? Хотя бы в рантайме.
Inspect.exe, среди прочих свойств объекта, показывает два поля:
RuntimeId
AnnotationID (в режиме MSAA)
Что это за айди такие? Откуда они берутся и как ими пользоваться? Я гуглил, но не смог найти вообще ничего по этому вопросу.
И еще, Inspect.exe работает в двух режимах: MSAA и UI Automation. В чем их различие??? Разве IAccessible — это не часть MSAA?
Здравствуйте, Freid, Вы писали:
F>RuntimeId
F>Что это за айди такие? Откуда они берутся и как ими пользоваться? Я гуглил, но не смог найти вообще ничего по этому вопросу.
??
да сходу:
RunTimeID Property Issue
Здравствуйте, kero, Вы писали:
K>??
K>да сходу: RunTimeID Property Issue
Это же ветка по WinAPI, а не .NET
Но проблема решилась с помощью интерфейса IAccIdentity, который возвращает IdentityString. Этва строка валидна в рантайме и может использоваться как уникальный айди контрода.
Есть еще IAccessibleEx, который умеет возвращать RuntimeID, но этот интерфейс относительно новый и не работает на чистой WInXP.
Здравствуйте, Аноним, Вы писали:
K>>да сходу: RunTimeID Property Issue
А>Это же ветка по WinAPI, а не .NET
Это-то тут причем ??
А>Но проблема решилась с помощью интерфейса IAccIdentity, который возвращает IdentityString. Этва строка валидна в рантайме и может использоваться как уникальный айди контрода.
А>Есть еще IAccessibleEx, который умеет возвращать RuntimeID, но этот интерфейс относительно новый и не работает на чистой WInXP.
Еще со времен XP:
UiaGetRuntimeId из UIAutomationCore.dll,
и хотя
"This function is deprecated. Client applications should use the Microsoft UI Automation COM interfaces instead" (MSDN) —
— работает и на Win7.