IvanChai
Новичок
- Сообщения
- 7
- Репутация
- 0
Имеем рабочий пример http://autoit-script.ru/index.php?topic=23438.msg135174#msg135174:
Возможно ли использовать полученные данные ($oWindow, $pWindow, $iChildElem, $oAcc, $pAcc или $tVarChildren) для управления элементами списка (выделение, фокус, прокрутка к элементу, вызов контекстного меню на заданном элементе) или остаётся только вариант использования стандартного Handle ($hWindow) вместе с IAccessible (который по факту нужен только для получения BoundRectangle и Name)? Если да, то каким образом?
Код:
#include "CUIAutomation2.au3"
#include "MSActiveAccessibility.au3"
Opt( "MustDeclareVars", 1 )
Global $hWnd
Global $hWindow
MainFunc()
Func MainFunc()
$hWnd = WinWait("[CLASS:d8348ccb68a1]", "", 10)
WinActivate($hWnd)
Local $ct ="[CLASSNN:SysListView321]";
$hWindow = ControlGetHandle($hWnd, "", $ct)
If Not $hWindow Then Return
; Get Window object
Local $pWindow, $oWindow
AccessibleObjectFromWindow( $hWindow, $OBJID_CLIENT, $tIID_IAccessible, $pWindow )
$oWindow = ObjCreateInterface( $pWindow, $sIID_IAccessible, $dtagIAccessible )
If Not IsObj( $oWindow ) Then Return
; Window name
Local $sName
ConsoleWrite( @CRLF & "Window:" )
ConsoleWrite( @CRLF & "-------" & @CRLF )
PrintObjectInfo( $oWindow, $CHILDID_SELF, "" )
; Get children
ConsoleWrite( "Children:" & @CRLF )
ConsoleWrite( "---------" & @CRLF )
WalkTreeWithAccessibleChildren( $pWindow, 0, 5 )
EndFunc
Func WalkTreeWithAccessibleChildren( $pAcc, $iLevel, $iLevels = 0 )
If $iLevels And $iLevel = $iLevels Then Return
; Create object
Local $oAcc = ObjCreateInterface( $pAcc, $sIID_IAccessible, $dtagIAccessible )
If Not IsObj( $oAcc ) Then Return
$oAcc.AddRef()
Local $iChildCount, $iReturnCount, $tVarChildren
; Get children
If $oAcc.get_accChildCount( $iChildCount ) Or Not $iChildCount Then Return
If AccessibleChildren( $pAcc, 0, $iChildCount, $tVarChildren, $iReturnCount ) Then Return
; Indentation
Local $sIndent = ""
For $i = 0 To $iLevel - 1
$sIndent &= " "
Next
Local $vt, $pChildObj, $oChildObj, $iChildElem
; For each child
For $i = 1 To $iReturnCount
; $tVarChildren is an array of VARIANTs with information about the children
$vt = BitAND( DllStructGetData( $tVarChildren, $i, 1 ), 0xFFFF )
If $vt = $VT_DISPATCH Then
; Child object
$pChildObj = DllStructGetData( $tVarChildren, $i, 3 )
$oChildObj = ObjCreateInterface( $pChildObj, $sIID_IAccessible, $dtagIAccessible )
If IsObj( $oChildObj ) Then
PrintObjectInfo( $oChildObj, $CHILDID_SELF, $sIndent )
WalkTreeWithAccessibleChildren( $pChildObj, $iLevel + 1, $iLevels )
EndIf
Else ; $vt = $VT_I4
; Child element
$iChildElem = DllStructGetData( $tVarChildren, $i, 3 )
PrintObjectInfo( $oAcc, $iChildElem, $sIndent )
EndIf
Next
EndFunc
Func PrintObjectInfo( $oAcc, $iChild, $sIndent )
Local $sName, $iRole, $sRole, $iRoleLen
Local $iState, $sState, $iStateLen
Local $sValue, $x, $y, $w, $h
If $iChild <> $CHILDID_SELF Then _
ConsoleWrite( $sIndent & "$iChildElem = " & $iChild & @CRLF )
$oAcc.get_accName( $iChild, $sName )
ConsoleWrite( $sIndent & "$sName = " & $sName & @CRLF )
If $oAcc.accLocation( $x, $y, $w, $h, $iChild ) = $S_OK Then _
ConsoleWrite( $sIndent & "$x, $y, $w, $h = " & $x & ", " & $y & ", " & $w & ", " & $h & @CRLF )
ConsoleWrite( @CRLF )
EndFunc
Возможно ли использовать полученные данные ($oWindow, $pWindow, $iChildElem, $oAcc, $pAcc или $tVarChildren) для управления элементами списка (выделение, фокус, прокрутка к элементу, вызов контекстного меню на заданном элементе) или остаётся только вариант использования стандартного Handle ($hWindow) вместе с IAccessible (который по факту нужен только для получения BoundRectangle и Name)? Если да, то каким образом?