Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   SysTreeView32 - как с этим работать? (http://forum.oszone.net/showthread.php?t=146460)

Firebolt 28-07-2009 14:40 1179810

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

amel27 29-07-2009 08:52 1180381

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 1180407

amel27, ничего себе! Если честно, мне тут мало чего понятно. Но спасибо большое!

amel27 29-07-2009 17:14 1180804

Цитата:

Цитата Firebolt
Если честно, мне тут мало чего понятно. »

на самом деле, последние два блока (вызов контекстного меню/выбор пункта) можно сделать на одних Send'ах... но интересно как раз обойтись без них... ;)

Firebolt 29-07-2009 20:56 1180991

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

sacredboy 13-09-2009 17:52 1218010

amel27, а с такими окнами тоже по такому же принципу работать?

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



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

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

amel27 14-09-2009 03:49 1218304

Цитата:

Цитата sacredboy
а с такими окнами тоже по такому же принципу работать? »

а почему бы и нет?.. есть проблемы?.. с виду выглядит аналогично

Цитата:

Цитата sacredboy
как раскрыть деревья внутри которых такие же чекбоксы »

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

sacredboy 14-09-2009 10:08 1218420

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 1218432

Цитата:

Цитата sacredboy
_GUICtrlTreeView_FindItem может выборочно снимать чекбоксы, если я правильно понял »

неправлильно понял - _GUICtrlTreeView_FindItem переходит по имени к нужному элементу определенной ветки, а ставит/снимает чекбокс обычный MouseClick

sacredboy 14-09-2009 18:15 1218878

То есть, в моему случае:

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



Верно?

sacredboy 15-09-2009 12:30 1219409

И еще $TVGN_FIRSTVISIBLE не понял что это за переменная, вернее ее значение.

amel27 16-09-2009 11:05 1220077

Цитата:

Цитата sacredboy
$TVGN_FIRSTVISIBLE не понял что это за переменная »

см. справку по _GUICtrlTreeView_SelectItem

sacredboy 18-09-2009 14:12 1221808

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 1221890

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 1254832

Никак не соображу...
Надо с начала списка проверять по очереди все элементы, если попадается отмеченный элемент, то соответствующее действие. И так пока весь список не прошерстит.

amel27 29-10-2009 12:38 1255507

ku7mich

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

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

ku7mich 01-11-2009 12:04 1258131

Вложений: 2
Код:

#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 1376860

Немного переделал скрип который во 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 1574770



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

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

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

semiono 27-12-2010 00:50 1575241

Что касается именно 'Show shadows under mouse pointer', решено!
Через вызов апи:
Код:

invoke SystemParametersInfo,SPI_SETDROPSHADOW,FALSE,NULL,SPIF_UPDATEINIFILE
Иногда бывает проще там где вовсе не ждёшь! :)
SPI_SETDROPSHADOW = 0x1025

_Alix_ 13-10-2011 15:08 1772493

Вложений: 1
Подскажите как выделить данный элемент в списке? см картинку.
Окошко активное, перемещение с помощью простых команд DOWN;UP работает, но данное решение не устраивает своей скоростью, грузится каждое окно настроек((
Как организовать перемещение с помощью обращения к SYSTreeView32.
если можно то по подробней...
заранее признателен!


Время: 20:40.

Время: 20:40.
© OSzone.net 2001-