Что нового

TreeView | Поиск в нужной ветке, активация элемента

Dezex

Новичок
Сообщения
7
Репутация
0
Доброго дня!

Уфф... давно с питоном сижу, но опять автоит понадобился...

Не могу додумать / найти следующее решение:
- Есть TreeView, нужно найти в определенной ветке параметр, активировать его, применить.
- Название параметры может "жить" в других ветках
- Метод ControlTreeView не дает получить текст (опции GetSelected/ Select работают)

В итоге пришел к UIA. Сейчас могу только активировать первый попавшийся (в другой ветке) элемент... Конечно могу тупо перебирать и сравнивать с ControlTreeView(...'GetSelected', 1).
Но это некрасиво и все таки думаю можно ограничить область поиска (одна из опций UIA_propertiesSupportedArray )... вопрос как?

Сейчас код выглядит так:

Код:
#include "CUIAutomation2.au3"
#include "UIAWrappers.au3"
#include <MsgBoxConstants.au3>


;ControlTreeView ( 'Новая спецификация', '', '[CLASS:TrDBTreeView; INSTANCE:1]', "Select", '#2|#2|#12|#0')

; Делаем фокус на окне с указанныйм объектом TreeView
ControlFocus ( 'Новая спецификация', '', '[CLASS:TrDBTreeView; INSTANCE:1]' )

Func MainFunc()

  ; Get window handle for Windows Updates Downloader
  Local $hWindow = WinGetHandle( 'Новая спецификация' )
  If Not $hWindow Then Return -1

  ; Create UI Automation object
  Local $oUIAutomation = ObjCreateInterface( $sCLSID_CUIAutomation, $sIID_IUIAutomation, $dtagIUIAutomation )
  If Not IsObj( $oUIAutomation ) Then Return -2

  ; Get UI Automation element from window handle
  Local $pWindow, $oWindow
  $oUIAutomation.ElementFromHandle( $hWindow, $pWindow )
  $oWindow = ObjCreateInterface( $pWindow, $sIID_IUIAutomationElement, $dtagIUIAutomationElement )
  If Not IsObj( $oWindow ) Then Return -3

  Local $oUIElement
  $oUIElement =_UIA_getObjectByFindAll($oWindow, "title:=Eltex MES1124M;ControlType:=UIA_TreeItemControlTypeId", $treescope_subtree)
  _UIA_action($oUIElement,"activate")


 ;$vv = _UIA_getBasePropertyInfo($oUIElement)
 ;ConsoleWrite($vv & @CRLF)
EndFunc

$var = MainFunc()
ConsoleWrite($var & @CRLF)

$var = ControlTreeView ( 'Новая спецификация', '', '[CLASS:TrDBTreeView; INSTANCE:1]', "GetSelected", 1)
ConsoleWrite($var & @CRLF)



Вывод WindowInfo:
>>>> Window <<<<
Title: Новая спецификация
Class: TADialog
Position: 522, 139
Size: 525, 867
Style: 0x16C40000
ExStyle: 0x00010100
Handle: 0x0003060A

>>>> Control <<<<
Class: TrDBTreeView
Instance: 1
ClassnameNN: TrDBTreeView1
Name:
Advanced (Class): [CLASS:TrDBTreeView; INSTANCE:1]
ID: 263698
Text:
Position: 2, 19
Size: 513, 784
ControlClick Coords: 64, 92
Style: 0x5401003F
ExStyle: 0x00000200
Handle: 0x00040612

>>>> Mouse <<<<
Position: 592, 273
Cursor ID: 0
Color: 0xFFFFBF

>>>> StatusBar <<<<

>>>> ToolsBar <<<<

>>>> Visible Text <<<<
Очистить
Отменить
ОК
Тип логического устройства:


>>>> Hidden Text <<<<

Вывод simplespy:
Having the following values for all properties:
Title is: <Alcatel OmniSwitch 6800-24> Class := <> controltype:= <UIA_TreeItemControlTypeId> ,<50024> , (0000C368) 606;807;164;16
*** Parent Information top down ***
4: Title is: <OSS АРГУС - Полная версия (Нижегородская)> Class := <TMainDockHost> controltype:= <UIA_WindowControlTypeId> ,<50032> , (0000C370) 0;106;1920;930
"Title:=OSS АРГУС - Полная версия (Нижегородская);controltype:=UIA_WindowControlTypeId;class:=TMainDockHost""
3: Title is: <Новая спецификация> Class := <TADialog> controltype:= <UIA_WindowControlTypeId> ,<50032> , (0000C370) 522;139;525;867
"Title:=Новая спецификация;controltype:=UIA_WindowControlTypeId;class:=TADialog""
2: Title is: <> Class := <TValueEditPanel> controltype:= <UIA_PaneControlTypeId> ,<50033> , (0000C371) 526;162;517;805
"Title:=;controltype:=UIA_PaneControlTypeId;class:=TValueEditPanel""
1: Title is: <> Class := <TAComboPlainTreeEdit> controltype:= <UIA_PaneControlTypeId> ,<50033> , (0000C371) 528;164;513;801
"Title:=;controltype:=UIA_PaneControlTypeId;class:=TAComboPlainTreeEdit""
0: Title is: <> Class := <TrDBTreeView> controltype:= <UIA_TreeControlTypeId> ,<50023> , (0000C367) 528;181;513;784
"Title:=;controltype:=UIA_TreeControlTypeId;class:=TrDBTreeView""


;~ *** Standard code maintainable ***
#include "UIAWrappers.au3"
AutoItSetOption("MustDeclareVars", 1)

_UIA_setVar("oP1","Title:=OSS АРГУС - Полная версия (Нижегородская);controltype:=UIA_WindowControlTypeId;class:=TMainDockHost") ;OSS АРГУС - Полная версия (Нижегородская)
_UIA_setVar("oP2","Title:=Новая спецификация;controltype:=UIA_WindowControlTypeId;class:=TADialog") ;Новая спецификация
_UIA_setVar("oP3","Title:=;controltype:=UIA_PaneControlTypeId;class:=TValueEditPanel") ;
_UIA_setVar("oP4","Title:=;controltype:=UIA_PaneControlTypeId;class:=TAComboPlainTreeEdit") ;
_UIA_setVar("oP5","Title:=;controltype:=UIA_TreeControlTypeId;class:=TrDBTreeView") ;

;~ $oUIElement=_UIA_getObjectByFindAll("AlcatelOmniSwitch6800-.mainwindow", "title:=Alcatel OmniSwitch 6800-24;ControlType:=UIA_TreeItemControlTypeId", $treescope_subtree)
_UIA_setVar("oUIElement","Title:=Alcatel OmniSwitch 6800-24;controltype:=UIA_TreeItemControlTypeId;class:=") ;ControlType:=UIA_TreeItemControlTypeId;classname:=")

;~ Actions split away from logical/technical definition above can come from configfiles

;~_UIA_Action("oP1","highlight")
_UIA_Action("oP1","setfocus")
;~_UIA_Action("oP2","highlight")
_UIA_Action("oP2","setfocus")
;~_UIA_Action("oP3","highlight")
_UIA_Action("oP3","setfocus")
;~_UIA_Action("oP4","highlight")
_UIA_Action("oP4","setfocus")
;~_UIA_Action("oP5","highlight")
_UIA_Action("oP5","setfocus")

_UIA_action("oUIElement","highlight")
;~_UIA_action("oUIElement","click")


;~ *** Standard code Flexible***
#include "UIAWrappers.au3"
AutoItSetOption("MustDeclareVars", 1)

Local $oP4=_UIA_getObjectByFindAll($UIA_oDesktop, "Title:=OSS АРГУС - Полная версия (Нижегородская);controltype:=UIA_WindowControlTypeId;class:=TMainDockHost", $treescope_children)
_UIA_Action($oP4,"setfocus")
Local $oP3=_UIA_getObjectByFindAll($oP4, "Title:=Новая спецификация;controltype:=UIA_WindowControlTypeId;class:=TADialog", $treescope_children)
_UIA_Action($oP3,"setfocus")
Local $oP2=_UIA_getObjectByFindAll($oP3, "Title:=;controltype:=UIA_PaneControlTypeId;class:=TValueEditPanel", $treescope_children)
_UIA_Action($oP2,"setfocus")
Local $oP1=_UIA_getObjectByFindAll($oP2, "Title:=;controltype:=UIA_PaneControlTypeId;class:=TAComboPlainTreeEdit", $treescope_children)
_UIA_Action($oP1,"setfocus")
Local $oP0=_UIA_getObjectByFindAll($oP1, "Title:=;controltype:=UIA_TreeControlTypeId;class:=TrDBTreeView", $treescope_children)
_UIA_Action($oP0,"setfocus")
;~ First find the object in the parent before you can do something
;~$oUIElement=_UIA_getObjectByFindAll("AlcatelOmniSwitch6800-.mainwindow", "title:=Alcatel OmniSwitch 6800-24;ControlType:=UIA_TreeItemControlTypeId", $treescope_subtree)
Local $oUIElement=_UIA_getObjectByFindAll($oP0, "title:=Alcatel OmniSwitch 6800-24;ControlType:=UIA_TreeItemControlTypeId", $treescope_subtree)
;~_UIA_action($oUIElement,"highlight")
_UIA_action($oUIElement,"click")


*** Detailed properties of the highlighted element ***
UIA_title:= <Alcatel OmniSwitch 6800-24>
UIA_text:= <Alcatel OmniSwitch 6800-24>
UIA_regexptitle:= <Alcatel OmniSwitch 6800-24>
UIA_iaccessiblevalue:= <3>
UIA_iaccessiblechildId:= <259800800>
UIA_handle:= <0>
UIA_RuntimeId:= <42;263698;2;-2147483647;263698;-4;259800800>
UIA_BoundingRectangle:= <606;807;164;16>
UIA_ProcessId:= <10808>
UIA_ControlType:= <50024>
UIA_LocalizedControlType:= <tree item>
UIA_Name:= <Alcatel OmniSwitch 6800-24>
UIA_HasKeyboardFocus:= <True>
UIA_IsKeyboardFocusable:= <True>
UIA_IsEnabled:= <True>
UIA_Culture:= <0>
UIA_IsControlElement:= <True>
UIA_IsContentElement:= <True>
UIA_IsPassword:= <False>
UIA_NativeWindowHandle:= <0>
UIA_IsOffscreen:= <False>
UIA_Orientation:= <0>
UIA_IsRequiredForForm:= <False>
UIA_IsDockPatternAvailable:= <False>
UIA_IsExpandCollapsePatternAvailable:= <False>
UIA_IsGridItemPatternAvailable:= <False>
UIA_IsGridPatternAvailable:= <False>
UIA_IsInvokePatternAvailable:= <False>
UIA_IsMultipleViewPatternAvailable:= <False>
UIA_IsRangeValuePatternAvailable:= <False>
UIA_IsScrollPatternAvailable:= <False>
UIA_IsScrollItemPatternAvailable:= <False>
UIA_IsSelectionItemPatternAvailable:= <True>
UIA_IsSelectionPatternAvailable:= <False>
UIA_IsTablePatternAvailable:= <False>
UIA_IsTableItemPatternAvailable:= <False>
UIA_IsTextPatternAvailable:= <False>
UIA_IsTogglePatternAvailable:= <False>
UIA_IsTransformPatternAvailable:= <False>
UIA_IsValuePatternAvailable:= <True>
UIA_IsWindowPatternAvailable:= <False>
UIA_ValueValue:= <3>
UIA_ValueIsReadOnly:= <False>
UIA_RangeValueValue:= <0>
UIA_RangeValueIsReadOnly:= <True>
UIA_RangeValueMinimum:= <0>
UIA_RangeValueMaximum:= <0>
UIA_RangeValueLargeChange:= <0>
UIA_RangeValueSmallChange:= <0>
UIA_ScrollHorizontalScrollPercent:= <0>
UIA_ScrollHorizontalViewSize:= <100>
UIA_ScrollVerticalScrollPercent:= <0>
UIA_ScrollVerticalViewSize:= <100>
UIA_ScrollHorizontallyScrollable:= <False>
UIA_ScrollVerticallyScrollable:= <False>
UIA_SelectionCanSelectMultiple:= <False>
UIA_SelectionIsSelectionRequired:= <False>
UIA_GridRowCount:= <0>
UIA_GridColumnCount:= <0>
UIA_GridItemRow:= <0>
UIA_GridItemColumn:= <0>
UIA_GridItemRowSpan:= <1>
UIA_GridItemColumnSpan:= <1>
UIA_DockDockPosition:= <5>
UIA_ExpandCollapseExpandCollapseState:= <3>
UIA_MultipleViewCurrentView:= <0>
UIA_WindowCanMaximize:= <False>
UIA_WindowCanMinimize:= <False>
UIA_WindowWindowVisualState:= <0>
UIA_WindowWindowInteractionState:= <0>
UIA_WindowIsModal:= <False>
UIA_WindowIsTopmost:= <False>
UIA_SelectionItemIsSelected:= <True>
UIA_TableRowOrColumnMajor:= <2>
UIA_ToggleToggleState:= <2>
UIA_TransformCanMove:= <False>
UIA_TransformCanResize:= <False>
UIA_TransformCanRotate:= <False>
UIA_IsLegacyIAccessiblePatternAvailable:= <True>
UIA_LegacyIAccessibleChildId:= <259800800>
UIA_LegacyIAccessibleName:= <Alcatel OmniSwitch 6800-24>
UIA_LegacyIAccessibleValue:= <3>
UIA_LegacyIAccessibleRole:= <36>
UIA_LegacyIAccessibleState:= <3145734>
UIA_IsDataValidForForm:= <False>
UIA_ProviderDescription:= <[pid:10808,hwnd:0x0 Annotation:Microsoft: Annotation Proxy (unmanaged:uiautomationcore.dll); Main(parent link):Microsoft: MSAA Proxy (unmanaged:uiautomationcore.dll)]>
UIA_IsItemContainerPatternAvailable:= <False>
UIA_IsVirtualizedItemPatternAvailable:= <False>
UIA_IsSynchronizedInputPatternAvailable:= <False>

Скрин окна с элементом, на котором запускал simplespy прикрепляю.
 

Вложения

  • Screenshot from 2018-04-17 17-01-40.png
    Screenshot from 2018-04-17 17-01-40.png
    60.1 КБ · Просмотры: 20
Автор
D

Dezex

Новичок
Сообщения
7
Репутация
0
Ладно... делаю как и говорил - через GetSelected.

Код:
#include "CUIAutomation2.au3"
#include "UIAWrappers.au3"
#include <MsgBoxConstants.au3>

Local $EqLocation[1][2] = [ _
	  ['Сеть передачи данных > Логические устройств СПД > Коммутаторы', '^#2\|#2\|#12\|#\d+$'] _
	  ]

Func ActivateTreeItem($title, $instance, $search, $pattern)

   ; Get window handle for Windows Updates Downloader
   Local $hWindow = WinGetHandle( $title )
   If Not $hWindow Then Return -1

   ; Create UI Automation object
   Local $oUIAutomation
   $oUIAutomation = ObjCreateInterface( $sCLSID_CUIAutomation, $sIID_IUIAutomation, $dtagIUIAutomation )
   If Not IsObj( $oUIAutomation ) Then Return -2

   ; Get UI Automation element from window handle
   Local $pWindow, $oWindow
   $oUIAutomation.ElementFromHandle( $hWindow, $pWindow )
   $oWindow = ObjCreateInterface( $pWindow, $sIID_IUIAutomationElement, $dtagIUIAutomationElement )
   If Not IsObj( $oWindow ) Then Return -3

   ; Активируем искомый элемент из определенной ветки TreeView
   Local $oUIElement, $path_tree, $index = 0, $match = 0
   while 1
	  $oUIElement =_UIA_getObjectByFindAll($oWindow, "title:="&$search&";ControlType:=UIA_TreeItemControlTypeId;index:="&$index, $treescope_subtree)
      If Not IsObj( $oUIElement ) Then Return -4
	  _UIA_action($oUIElement,"activate")

	  $path_tree = ControlTreeView ( $title, '', $instance, "GetSelected", 1)
	  $match     = StringRegExp($path_tree, $pattern)

	  if $match == 1 Then Return 1

      $index += 1
   WEnd

  _UIA_action($oUIElement,"activate")

EndFunc

; Активируем окно
$sTitle_2 = 'Новая спецификация'
WinActivate ($sTitle_2)
WinWaitActive($sTitle_2, '',2)

$var = ActivateTreeItem($sTitle_2, '[CLASS:TrDBTreeView; INSTANCE:1]', 'Juniper MX480', $EqLocation[0][1])
MsgBox($MB_OK,'TEST', $var)
 
Верх