Что нового

Создание объекта IAccessible из элемента IUIAutomation

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
У элемента UIAutomation есть метод GetIAccessible. Судя по описанию, данный метод возвращает указатель на интерфейс IAccessible. Функция VarGetType сообщает, что это объект, но IsObj этого не подтверждает. Пробовал получить свойство accChildCount через метод get_accChildCount, но получил ошибку. Причём ошибка не в том, что это не объект, а, видимо, в том, что не находит такого метода.
Код:
#include <UIAutomate.au3> ; http://autoit-script.ru/index.php?topic=16780.0

$hCtrl = ControlGetHandle("Program Manager", "", "SysListView321") ; рабочий стол Win7
$oElement = _UIA_GetElementFromHandle($hCtrl)

Global $pIAccess, $oIAccess, $oAcc, $iCount
$oElement.GetCurrentPattern($UIA_LegacyIAccessiblePatternId, $pIAccess)
$oIAccess = ObjCreateInterface($pIAccess, $sIID_IUIAutomationLegacyIAccessiblePattern, $dtagIUIAutomationLegacyIAccessiblePattern)

$oIAccess.GetIAccessible($oAcc)
ConsoleWrite(VarGetType($oAcc) & ":" & IsObj($oAcc) & @CRLF)

$oAcc.get_accChildCount($iCount)
ConsoleWrite($iCount & @CRLF)

Ещё пробовал создать объект из описания интерфейса, но тоже безрезультатно.
Код:
Global Const $sIID_IAccessible="{618736E0-3C3D-11CF-810C-00AA00389B71}"
Global $dtagIAccessible = "GetTypeInfoCount hresult(uint*);" & _ ; IDispatch
"GetTypeInfo hresult(uint;int;ptr*);" & _
"GetIDsOfNames hresult(struct*;wstr;uint;int;int);" & _
"Invoke hresult(int;struct*;int;word;ptr*;ptr*;ptr*;uint*);" & _
"get_accParent hresult(ptr*);" & _                               ; IAccessible
"get_accChildCount hresult(long*);" & _
"get_accChild hresult(variant;idispatch*);" & _
"get_accName hresult(variant;bstr*);" & _
"get_accValue hresult(variant;bstr*);" & _
"get_accDescription hresult(variant;bstr*);" & _
"get_accRole hresult(variant;variant*);" & _
"get_accState hresult(variant;variant*);" & _
"get_accHelp hresult(variant;bstr*);" & _
"get_accHelpTopic hresult(bstr*;variant;long*);" & _
"get_accKeyboardShortcut hresult(variant;bstr*);" & _
"get_accFocus hresult(struct*);" & _
"get_accSelection hresult(variant*);" & _
"get_accDefaultAction hresult(variant;bstr*);" & _
"accSelect hresult(long;variant);" & _
"accLocation hresult(long*;long*;long*;long*;variant);" & _
"accNavigate hresult(long;variant;variant*);" & _
"accHitTest hresult(long;long;variant*);" & _
"accDoDefaultAction hresult(variant);" & _
"put_accName hresult(variant;bstr);" & _
"put_accValue hresult(variant;bstr);"

...

$oIAccess.GetIAccessible($pAcc)
$oAcc = ObjCreateInterface($pAcc, $sIID_IAccessible, $dtagIAccessible)
ConsoleWrite(VarGetType($oAcc) & ":" & IsObj($oAcc) & @CRLF)

$oAcc.get_accChildCount($iCount)
ConsoleWrite($iCount & @CRLF)

Как получить доступ к методам IAccessible?
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
описание метода GetIAccessible смените на "GetIAccessible hresult(ptr*);"
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
inververs
Поменял. Теперь VarGetType возвращает Int32. Но объект через ObjCreateInterface не создаётся.
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Если кому интересно, то объект IAccessible создаётся так
Код:
$oIAccess.GetIAccessible($pAcc)
$oAcc = ObjCreateInterface($pAcc, $sIID_IAccessible, $dtagIAccessible)
Но создаётся он не для всех окон/контролов. Вероятно, зависит от уровня поддержки приложением данного интерфейса. Так, например, для Chrome и Firefox объект создаётся. А для остальных приложений, в том числе и от Microsoft, создать объект не удалось.
 

Naisho

Знающий
Сообщения
86
Репутация
12
Интересно, надо будет попробовать - а то при неработающем "SetValue" в "UIA" использование ControlSend() в цикле несколько напрягает...
 
Верх