IAccessible - идентификация контролов
От: Freid  
Дата: 06.09.12 15:48
Оценка:
Добрый день.

Я занимаюсь разработкой программы по автоматизации графического интерфейса и столкнулся с принципиальной проблемой.

Для получения дерева контролов я использую IAccessible интерфейс. Всё прекрасно, но быстро выяснилось, что объекты не имеют никаких уникальных свойств, которые позволяли бы четко идентифицировать каждый конкретный контрол. То есть, прежде всего у них нет никакого уникального ID. Каждый элемент, фактически, имеет всего два свойства — Имя и Роль. Мало того, что имя может меняться, что оно может многократно повторятся внутри одного приложения, так оно еще может вообще быть пустым. Роль — тоже никак не является уникальной. Поэтому нет никакой возможности достоверное определить элемент!

А мне просто необходимо вести точный учет контролов и, более того, хранить всё дерево в базе данных для последующего его использования, при поиске маршрутов к тем или иным контролам.

Собственно, вопрос. Существет ли какая-то возможность идентификации? Хотя бы в рантайме.

Inspect.exe, среди прочих свойств объекта, показывает два поля:

RuntimeId
AnnotationID (в режиме MSAA)

Что это за айди такие? Откуда они берутся и как ими пользоваться? Я гуглил, но не смог найти вообще ничего по этому вопросу.

И еще, Inspect.exe работает в двух режимах: MSAA и UI Automation. В чем их различие??? Разве IAccessible — это не часть MSAA?
msaa ui automation
Re: IAccessible - идентификация контролов
От: kero Россия  
Дата: 08.09.12 00:25
Оценка:
Здравствуйте, Freid, Вы писали:

F>RuntimeId


F>Что это за айди такие? Откуда они берутся и как ими пользоваться? Я гуглил, но не смог найти вообще ничего по этому вопросу.


??
да сходу: RunTimeID Property Issue
По всему, пашиным хозяевам позарез нужна война в Европе
(уверены — к ним не залетит, в предыдущих двух не залетало жеж)
Автор: kero
Дата: 21.07.14
Re[2]: IAccessible - идентификация контролов
От: Аноним  
Дата: 08.09.12 11:18
Оценка:
Здравствуйте, kero, Вы писали:

K>??

K>да сходу: RunTimeID Property Issue

Это же ветка по WinAPI, а не .NET

Но проблема решилась с помощью интерфейса IAccIdentity, который возвращает IdentityString. Этва строка валидна в рантайме и может использоваться как уникальный айди контрода.

Есть еще IAccessibleEx, который умеет возвращать RuntimeID, но этот интерфейс относительно новый и не работает на чистой WInXP.
Re[3]: IAccessible - идентификация контролов
От: kero Россия  
Дата: 08.09.12 18:00
Оценка:
Здравствуйте, Аноним, Вы писали:

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.
По всему, пашиным хозяевам позарез нужна война в Европе
(уверены — к ним не залетит, в предыдущих двух не залетало жеж)
Автор: kero
Дата: 21.07.14
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.