Показать полную графическую версию : SysTreeView32 - как с этим работать?
Firebolt
28-07-2009, 14:40
Прикрепляю две фотки: 1 - то, какое окно открывается; 2 - то что нужно в этом окне сделать - выбрать в дополнительных интерфейсах установку казахского интерфейса. Как мне грамотно это сделать?
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, ничего себе! Если честно, мне тут мало чего понятно. Но спасибо большое!
Если честно, мне тут мало чего понятно. »на самом деле, последние два блока (вызов контекстного меню/выбор пункта) можно сделать на одних 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.
И как раскрыть деревья внутри которых такие же чекбоксы?
а с такими окнами тоже по такому же принципу работать? »а почему бы и нет?.. есть проблемы?.. с виду выглядит аналогично
как раскрыть деревья внутри которых такие же чекбоксы »
_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]?
_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 не понял что это за переменная, вернее ее значение.
$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
Можешь сказать в чем проблема?
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
в посте #2 ищется пошагово - каждый промежуточный узел/ветка вплоть до той, которая содежит нужный элемент... а не "все элементы"
в посте #14 в UDF сразу передается весь "путь" к нужному элементу
#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")
Немного переделал скрип который во 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 ваш к сожалению пол дня гонял/удалял, пол кода удалил он мне все равно делал не то что нужно, но работал.
http://d.imagehost.org/0807/Snap4.png
Нужно убрать галочку 'Show shadows under mouse pointer'
Запуск консоли можно выполнить примерно так:
control sysdm.cpl,,-1
Кнопка "Custom" насколько я понял устанавливается сама при любом клике в SysTreeView32, хотя проверку не помешает зделать.
Меня интересует английская "моя" версия только, если с этим есть различия. Вообщем чтоб у меня работало.
Что касается именно 'Show shadows under mouse pointer', решено!
Через вызов апи:
invoke SystemParametersInfo,SPI_SETDROPSHADOW,FALSE,NULL,SPIF_UPDATEINIFILE
Иногда бывает проще там где вовсе не ждёшь! :)
SPI_SETDROPSHADOW = 0x1025
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.