PDA

Показать полную графическую версию : SysTreeView32 - как с этим работать?


Страниц : [1] 2

Firebolt
28-07-2009, 14:40
Прикрепляю две фотки: 1 - то, какое окно открывается; 2 - то что нужно в этом окне сделать - выбрать в дополнительных интерфейсах установку казахского интерфейса. Как мне грамотно это сделать?

amel27
29-07-2009, 08:52
Firebolt, думаю где-то так:
#include <GuiMenu.au3>
#include <GuiTreeView.au3>
#Include <SendMessage.au3>
#Include <WindowsConstants.au3>

$WinTitle= "1С:Предприятие 8.1"
$WinText = "Выберите компоненты программы"

WinWait($WinTitle, $WinText)
; ищем элемент окна и последовательно нужный пункт списка
$hDTCtrl = ControlGetHandle($WinTitle, "", "SysTreeView321")
$hDTItem = _GUICtrlTreeView_FindItem($hDTCtrl, "Дополнительные интерфейсы")
$hDTIt_1 = _GUICtrlTreeView_FindItem($hDTCtrl, "Казахский", False, $hDTItem)
; активируем окно
WinActivate($WinTitle, $WinText)
WinWaitActive($WinTitle, $WinText)
; переходим к нужному пункту списка
_GUICtrlTreeView_SelectItem($hDTCtrl, $hDTIt_1, $TVGN_FIRSTVISIBLE)
_GUICtrlTreeView_ClickItem ($hDTCtrl, $hDTIt_1, "left", True)
; вызываем контекстное меню
$aRect = _GUICtrlTreeView_DisplayRect($hDTCtrl, $hDTIt_1, True)
ControlClick($WinTitle, $WinText, $hDTCtrl, "left", 1, $aRect[0]-10, $aRect[1]+5)
WinWait("[CLASS:#32768]")
; выбираем нужный пункт контекстного меню
$hWnd = WinGetHandle("[CLASS:#32768]")
$hMenu = _SendMessage($hWnd, $MN_GETHMENU, 0, 0)
$aRect = _GUICtrlMenu_GetItemRect($hWnd, $hMenu, 0)
MouseClick("left", $aRect[0]+20, $aRect[1]+15, 1, 1)

З.Ы. 1С под рукой нет, поэтому проверял на офисе 2003

Firebolt
29-07-2009, 09:26
amel27, ничего себе! Если честно, мне тут мало чего понятно. Но спасибо большое!

amel27
29-07-2009, 17:14
Если честно, мне тут мало чего понятно. »на самом деле, последние два блока (вызов контекстного меню/выбор пункта) можно сделать на одних Send'ах... но интересно как раз обойтись без них... ;)

Firebolt
29-07-2009, 20:56
amel27, да вот именно! А можно все на сэндах сделать. Так я и сделал сам, на одних сэндах. Но хочу изучить язык глубже, так что ваш пример мне в этом очень поможет.

sacredboy
13-09-2009, 17:52
amel27, а с такими окнами тоже по такому же принципу работать?

Как быть с такими чекбоксами? Какой функцией их снимать? Вроде и чекбоксы но AutoIT Window Info определяет их как SysTreeView32.

http://img406.imageshack.us/img406/3518/winamph.th.jpg (http://img406.imageshack.us/i/winamph.jpg/)

Куда ни наведи везде INSTANCE один и тот же SysTreeView32.

И как раскрыть деревья внутри которых такие же чекбоксы?

amel27
14-09-2009, 03:49
а с такими окнами тоже по такому же принципу работать? »а почему бы и нет?.. есть проблемы?.. с виду выглядит аналогично

как раскрыть деревья внутри которых такие же чекбоксы »
_GUICtrlTreeView_Expand/_GUICtrlTreeView_ExpandedOnce, для того, чтобы работать с отдельным элементом не обязательно раскрывать ветку - _GUICtrlTreeView_FindItem делает это автоматически

sacredboy
14-09-2009, 10:08
amel27, а вот такой вопрос, ты говоришь что _GUICtrlTreeView_Expand/_GUICtrlTreeView_ExpandedOnce раскрывают все ветки (т.е. по сути нажимают плюсы для раскрытия всего дерева), а _GUICtrlTreeView_FindItem может выборочно снимать чекбоксы, если я правильно понял. Так вот, а как указывать конкретную ветку если AutoIT Window Info определяет такие ветки, в моем случае Multimedia Engine, Winamp Library, User Interface Extension и Visualisation одинаково, т.е. [CLASS:SysTreeView32; INSTANCE:1]?

amel27
14-09-2009, 10:31
_GUICtrlTreeView_FindItem может выборочно снимать чекбоксы, если я правильно понял »неправлильно понял - _GUICtrlTreeView_FindItem переходит по имени к нужному элементу определенной ветки, а ставит/снимает чекбокс обычный MouseClick

sacredboy
14-09-2009, 18:15
То есть, в моему случае:

_GUICtrlTreeView_Expand - раскроет ветку Winamp Library
_GUICtrlTreeView_FindItem - найдет чекбокс Winamp Media Library
ControlClick - поставит/снимет чекбокс.

http://img27.imageshack.us/img27/2435/winampf.th.jpg (http://img27.imageshack.us/i/winampf.jpg/)

Верно?

sacredboy
15-09-2009, 12:30
И еще $TVGN_FIRSTVISIBLE не понял что это за переменная, вернее ее значение.

amel27
16-09-2009, 11:05
$TVGN_FIRSTVISIBLE не понял что это за переменная »
см. справку по _GUICtrlTreeView_SelectItem

sacredboy
18-09-2009, 14:12
amel27, вот по твоему примеру написал:

; Скрипт установки Winamp

#include <GuiTreeView.au3>
#include <WindowsConstants.au3>
#include <GuiMenu.au3>
#include <SendMessage.au3>

Run ("C:\Install\winamp556_full_en-us.exe")
Sleep (1000)
WinWaitActive ("Winamp Installer")
Sleep (1000)
ControlClick ("Winamp Installer", "", "Button2")
Sleep (1000)
ControlClick ("Winamp Installer", "", "Button2")
Sleep (1000)
ControlSend ("Winamp Installer", "Destination Folder","Edit1", @ProgramFilesDir & "\Winamp 5.5.6")
Sleep (1000)
ControlClick ("Winamp Installer", "", "Button2")
Sleep (1000)
ControlCommand ("Winamp Installer", "Select the type of install:", "ComboBox1", "SelectString", "Custom")

$WinTitle = "Winamp Installer"
$WinText = "Choose Components"

; ищем элемент окна и последовательно нужный пункт списка
$hDTCtrl = ControlGetHandle ($WinTitle, "", "SysTreeView321")
$hDTItem_1 = _GUICtrlTreeView_FindItem ($hDTCtrl, "Winamp Agent")
$hDTItem_2 = _GUICtrlTreeView_FindItem ($hDTCtrl, "Multimedia Engine")
$hDTIt_1 = _GUICtrlTreeView_FindItem ($hDTCtrl, "Video Playback", False, $hDTItem_2)

; активируем окно
WinActivate ($WinTitle, $WinText)
WinWaitActive ($WinTitle, $WinText)

; переходим к нужному пункту списка
_GUICtrlTreeView_SelectItem ($hDTCtrl, $hDTItem_1, $TVGN_FIRSTVISIBLE)
_GUICtrlTreeView_ClickItem ($hDTCtrl, $hDTItem_1, "left", True) ; снимает чекбокс Winamp Agent
Sleep (1000)
_GUICtrlTreeView_Expand ($hDTCtrl, $hDTItem_2, $TVGN_FIRSTVISIBLE) ; раскрывает ветку Multimedia Engine
Sleep (1000)
_GUICtrlTreeView_ClickItem ($hDTCtrl, $hDTItem_2, "left", True) ; не снимает чекбокс Video Playback
Можешь сказать в чем проблема?

amel27
18-09-2009, 16:19
sacredboy, так понятней?
#Include <GuiTreeView.au3>

$WinTitle = "Winamp Installer"
$WinText = "Choose Components"

; активируем окно
WinActivate($WinTitle, $WinText)
WinWaitActive($WinTitle, $WinText)

$hDTCtrl = ControlGetHandle ($WinTitle, "", "SysTreeView321")

_GUICtrlTreeView_ClickItemEx($hDTCtrl, "Winamp Agent", 0, "left", True) ; снимает чекбокс Winamp Agent
_GUICtrlTreeView_ClickItemEx($hDTCtrl, "Multimedia Engine|Video Playback", 0, "left", True) ; раскрывает ветку Video Playback

Func _GUICtrlTreeView_ClickItemEx($hCtrl, $sItemPath, $hStart = 0, $sButton = "left", $fMove = False, $iClicks = 1, $iSpeed = 0)
Local $iRet, $hItem = _GUICtrlTreeView_FindItemEx($hCtrl, $sItemPath, $hStart)
If Not($hItem) Then Return SetError(1, 0, False)

$iRet = _GUICtrlTreeView_SelectItem($hCtrl, $hItem, $TVGN_FIRSTVISIBLE)
If Not($iRet) Then Return SetError(2, 0, False)

_GUICtrlTreeView_ClickItem ($hCtrl, $hItem, $sButton, $fMove, $iClicks, $iSpeed)
Return True
EndFunc

ku7mich
28-10-2009, 16:21
Никак не соображу...
Надо с начала списка проверять по очереди все элементы, если попадается отмеченный элемент, то соответствующее действие. И так пока весь список не прошерстит.

amel27
29-10-2009, 12:38
ku7mich

в посте #2 ищется пошагово - каждый промежуточный узел/ветка вплоть до той, которая содежит нужный элемент... а не "все элементы"

в посте #14 в UDF сразу передается весь "путь" к нужному элементу

ku7mich
01-11-2009, 12:04
#include <GUIConstants.au3>
#Include <GuiTreeView.au3>
#include <GuiTab.au3>

$WinTitle = "Win_01"
WinWaitActive($WinTitle)

$hTab = ControlGetHandle($WinTitle,"","SysTabControl321")
_GUICtrlTab_ClickTab($hTab, 4)

$hTreeView = ControlGetHandle ($WinTitle, "", "SysTreeView321")
; раскрываю всё дерево - раскрываются только отмеченные галочкой пункты, что меня вполне устраивает
_GUICtrlTreeView_Expand($hTreeView, True)
; после перехода на закладку с деревом и его раскрытием фокус отдаётся кнопке "Properties"
; фокус передаю дереву
ControlFocus($WinTitle, "", $hTreeView)

После раскрытия всего дерева и передачи ему фокуса, под фокус попадает последний раскрытый пункт, в моём случае это AKS_PRC, а надо на первый. Но передать фокус надо не по названию пункта, а по его индексу в дереве. Как?

Нашёл, вот этим вот передал фокус на первый пункт в дереве:
ControlTreeView ($WinTitle,"",$hTreeView, "Select", "#0")

WoRG
25-03-2010, 14:22
Немного переделал скрип который во 2 сообщении под свое меню, установка аимп удаление лишних языков кроме русского:

WinWait($WinTitle, "Компоненты устанавливаемой программы")
WinActivate($WinTitle, "Компоненты устанавливаемой программы")
WinWaitActive($WinTitle, "Компоненты устанавливаемой программы")
ControlCommand($WinTitle,"Выберите тип установки:","ComboBox1","SelectString","Полная")
#include <GuiTreeView.au3>
$WinTitle = "AIMP2 Setup"
$hDTCtrl = ControlGetHandle($WinTitle, "", "SysTreeView321")
$hDTItem = _GUICtrlTreeView_FindItem($hDTCtrl, "Языки интерфейса")
$hDTIt_1 = _GUICtrlTreeView_FindItem($hDTCtrl, "Русский (по умолчанию)")
; переходим к нужному пункту списка
_GUICtrlTreeView_SelectItem($hDTCtrl, $hDTItem, $TVGN_FIRSTVISIBLE)
; выключаем ветку Языки интерфейса
_GUICtrlTreeView_ClickItem ($hDTCtrl, $hDTItem, "left", True)
; переходим к нужному пункту списка
_GUICtrlTreeView_SelectItem($hDTCtrl, $hDTIt_1, $TVGN_FIRSTVISIBLE)
; включаем русский язык
_GUICtrlTreeView_ClickItem ($hDTCtrl, $hDTIt_1, "left", True)
Вроде получилось совсем просто, может кому поможет, ибо SysTreeView32 такая заноза...
В винампе собственно так же только изменить переменные.
sacredboy ваш к сожалению пол дня гонял/удалял, пол кода удалил он мне все равно делал не то что нужно, но работал.

semiono
26-12-2010, 13:44
http://d.imagehost.org/0807/Snap4.png

Нужно убрать галочку 'Show shadows under mouse pointer'

Запуск консоли можно выполнить примерно так:
control sysdm.cpl,,-1

Кнопка "Custom" насколько я понял устанавливается сама при любом клике в SysTreeView32, хотя проверку не помешает зделать.
Меня интересует английская "моя" версия только, если с этим есть различия. Вообщем чтоб у меня работало.

semiono
27-12-2010, 00:50
Что касается именно 'Show shadows under mouse pointer', решено!
Через вызов апи:
invoke SystemParametersInfo,SPI_SETDROPSHADOW,FALSE,NULL,SPIF_UPDATEINIFILE
Иногда бывает проще там где вовсе не ждёшь! :)
SPI_SETDROPSHADOW = 0x1025




© OSzone.net 2001-2012