Что нового

Не получается добраться до значения элемента, хотя вижу его в Inspector

IvanChai

Новичок
Сообщения
7
Репутация
0
Пытаюсь управлять сторонним приложением (Zello), с помощью AutoIt последней версии. Читая интернеты и используя различные утилиты наконец удалось с помощью Inspect_W7 (в режиме MSAA) достучаться до списка и до его значений (см. скрин). При этом ни AutoIt Window info, ни SimpleSpy этих значений не видят.

Сейчас пытаюсь достучаться до значения Name, но это никак не получается, нашёл на autoitscript.com /forum/topic/153520-iuiautomation-ms-framework-automate-chrome-ff-ie/ пример и библиотеки, для работы с MSAA, достучался до Role и BoundingRectangle.

Код ниже достаёт содержимое списка(13-й пример из архива по ссылке, немного модифицированный), но значения Name там пустые:

Код:
#include "CUIAutomation2.au3"

Opt( "MustDeclareVars", 1 )

Global $oUIAutomation
Global $hWnd

MainFunc()


Func MainFunc()

  $hWnd = WinWait("[CLASS:d8348ccb68a1]", "", 10)
  WinActivate($hWnd)

  Local $ct ="[CLASSNN:SysListView321]";
  Local $hWindow = ControlGetHandle($hWnd, "", $ct)


  If Not $hWindow Then Return

  $oUIAutomation = ObjCreateInterface( $sCLSID_CUIAutomation, $sIID_IUIAutomation, $dtagIUIAutomation )
  If Not IsObj( $oUIAutomation ) Then Return

  Local $pWindow
  $oUIAutomation.ElementFromHandle( $hWindow, $pWindow ) ; Window
  If Not $pWindow Then Return

  Local $oWindow = ObjCreateInterface( $pWindow, $sIID_IUIAutomationElement, $dtagIUIAutomationElement )
  If Not IsObj( $oWindow ) Then Return

  ListDescendants( $oWindow, 0, 0 )  ; Window

EndFunc


Func ListDescendants( $oParent, $iLevel, $iLevels = 0 )

  If Not IsObj( $oParent ) Then Return
  If $iLevels And $iLevel = $iLevels Then Return

  Local $pRawWalker, $oRawWalker
  $oUIAutomation.RawViewWalker( $pRawWalker )
  $oRawWalker = ObjCreateInterface( $pRawWalker, $sIID_IUIAutomationTreeWalker, $dtagIUIAutomationTreeWalker )

  Local $pUIElement, $oUIElement
  $oRawWalker.GetFirstChildElement( $oParent, $pUIElement )
  $oUIElement = ObjCreateInterface( $pUIElement, $sIID_IUIAutomationElement, $dtagIUIAutomationElement )

  Local $sIndent = ""
  For $i = 0 To $iLevel - 1
    $sIndent &= "    "
  Next

  While IsObj( $oUIElement )
    ConsoleWrite( $sIndent & "Title     = " & _UIA_getPropertyValue( $oUIElement, $UIA_NamePropertyId ) & @CRLF & _
                  $sIndent & "Any       = " & _UIA_getPropertyValue( $oUIElement, $UIA_LegacyIAccessibleNamePropertyId ) & @CRLF & _
                  $sIndent & "Bound     = " & _UIA_getPropertyValue( $oUIElement, $UIA_BoundingRectanglePropertyId ) & @CRLF & _
                  $sIndent & "Role      = " & Hex(_UIA_getPropertyValue( $oUIElement, $UIA_LegacyIAccessibleRolePropertyId ) ) & @CRLF)

    ListDescendants( $oUIElement, $iLevel + 1, $iLevels )

    $oRawWalker.GetNextSiblingElement( $oUIElement, $pUIElement )
    $oUIElement = ObjCreateInterface( $pUIElement, $sIID_IUIAutomationElement, $dtagIUIAutomationElement )
  WEnd
EndFunc


Func _UIA_getPropertyValue( $obj, $id )
  Local $tVal
  $obj.GetCurrentPropertyValue( $id, $tVal )
  If Not IsArray( $tVal ) Then Return $tVal
  Local $tStr = $tVal[0]
  For $i = 1 To UBound( $tVal ) - 1
    $tStr &= "; " & $tVal[$i]
  Next
  Return $tStr
EndFunc


В консоли получаю:
Код:
...
Name 1    = 
Name 2    = 
Bound     = 1597; 103; 238; 24
Role      = 00000022
    Name 1    = 
    Name 2    = 
    Bound     = 1601; 103; 234; 24
    Role      = 00000029
Name 1    = 
Name 2    = 
Bound     = 1597; 127; 238; 24
Role      = 00000022
    Name 1    = 
    Name 2    = 
    Bound     = 1601; 127; 234; 24
    Role      = 00000029
...

Подскажите как можно достучаться до Name, которые видны на скриншоте?
 

Вложения

  • Снимок.JPG
    Снимок.JPG
    95.5 КБ · Просмотры: 13

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
IvanChai
пример и библиотеки, для работы с MSAA
Этот пример работает через UIAutomation. Вам нужен вот этот пример: #136

Впервые такое встречаю - IUIAutomation не видит имён элементов IAccessible :scratch:
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
IvanChai

Предупреждение За нарушение общих правил (пункт В.4):
Не лепите несколько вопросов разной тематики в один пост. По типу "Ребят, а ещё такой вопрос...". Каждый вопрос в свою тему.


С уважением, ваш Глобальный модератор.
 
Верх