Что нового

[Окна, Диалоги] Выбор папки из элемента SysTreeView32

alex33

Скриптер
Сообщения
1,457
Репутация
186
Здравствуйте.
Появилась такая проблема, не знаю как выбрать, а точнее ввести путь в элемент SysTreeView32 диалога выбора файлов...
Вот такой диалог:

Код:
>>>> Window <<<<
Title:	Обзор папок
Class:	#32770
Position:	521, 197
Size:	324, 334
Style:	0x14C808C4
ExStyle:	0x00010101
Handle:	0x00110854

>>>> Control <<<<
Class:	SysTreeView32
Instance:	1
ClassnameNN:	SysTreeView321
Name:	
Advanced (Class):	[CLASS:SysTreeView32; INSTANCE:1]
ID:	14145
Text:	
Position:	13, 44
Size:	292, 204
ControlClick Coords:	81, 176
Style:	0x50314001
ExStyle:	0x00000204
Handle:	0x007B039E

>>>> Mouse <<<<
Position:	618, 442
Cursor ID:	0
Color:	0xFFFFFF

>>>> StatusBar <<<<

>>>> ToolsBar <<<<

>>>> Visible Text <<<<
Select ... installation directory
ОК
Отмена


>>>> Hidden Text <<<<
Я попробовал написать примерно так:
Код:
$hTree=ControlGetHandle($hwnd2,"","SysTreeView321")
ControlTreeView($hwnd2,"",$hTree,"Select","Рабочий стол|Компьютер|System (C:)|Program Files|blabla")

У меня это работает. Но потом думаю... Это ведь может не работать на других компьютерах / системах... И точно, запустил на другом компе, не сработало - диск подругому называется, запустил на третьем компе, тоже не сработало - вместо "компьютер" было написано "Мой компьютер"...
А путь мне заранее известный и хранится в переменной:
Код:
$path = "C:\Program Files\blabla"; // вообще я считываю путь из реестра ( RegRead ) и он получается примерно такой...


Вопрос: как выбрать папку из такого окна? Поля edit / input для ввода пути в этом окне нет.
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
alex33
ввести путь в элемент SysTreeView32 диалога выбора файлов
Или всё-таки в диалог выбора папок ?
Код:
#include <GuiTreeView.au3>

$sPath = "C:\Program Files\Internet Explorer"
$aPath = StringSplit($sPath, "\")
$hTree = ControlGetHandle("Обзор папок", "", "SysTreeView321")

$hItem = 0
For $i = 1 To $aPath[0]
  $hItem = _GUICtrlTreeView_FindItem($hTree, $aPath[$i], True, $hItem)
  _GUICtrlTreeView_Expand($hTree, $hItem)
Next
_GUICtrlTreeView_SelectItem($hTree, $hItem)
 

yakovlev_kll

Новичок
Сообщения
5
Репутация
0
InnI сказал(а):
alex33
Или всё-таки в диалог выбора папок ?

Доброго времени суток!
Облазил много источников, но найти подходящего ответа не смог. Ваш скрипт из-под моих неопытных рук не взлетает. Не могли бы мне помочь с пониманием причины? Хочу автоматизировать установку одной программы. Работаю на win 7 x64, ситуация похожая, как мне кажется (фото, window info summary прикрепляю).
После запуска скрипта в окне ничего не подсвечивается, закрыть с помощью OK не могу, только с помощью отмены.

Пока есть такое:
Код:
#RequireAdmin
#include <GuiTreeView.au3>
$kPath = "C:\music staff\Kontakt 5"
$vst32Path = "C:\music staff\VST\Kontakt 5 (x32)"
$vst64Path = "C:\music staff\VST\Kontakt 5 (x64)"

;Run(@ScriptDir & '\Kontakt 5.1.0 Setup PC.exe')
AutoItSetOption('MouseCoordMode', 0)
AutoItSetOption('SendKeyDelay', 10)

WinWait('Native Instruments Kontakt 5 - InstallAware Wizard')
WinActivate('Native Instruments Kontakt 5 - InstallAware Wizard')

ControlClick('Native Instruments Kontakt 5 - InstallAware Wizard', '', 'TButton2')
Sleep(300)
ControlClick('Native Instruments Kontakt 5 - InstallAware Wizard', '', 'TRzCheckBox1')
Sleep(300)
ControlClick('Native Instruments Kontakt 5 - InstallAware Wizard', '', 'TButton3')
Sleep(300)
ControlClick('Native Instruments Kontakt 5 - InstallAware Wizard', '', 'TButton2')
Sleep(300)
ControlClick('Native Instruments Kontakt 5 - InstallAware Wizard', '', 'TButton4')

WinWait("Обзор папок")
WinActivate("Обзор папок")

$aPath = StringSplit($kPath, "\")
$hTree = ControlGetHandle("Обзор папок", "", "SysTreeView321")
$hItem = 0
For $i = 1 To $aPath[0]
  $hItem = _GUICtrlTreeView_FindItem($hTree, $aPath[$i], True, $hItem)
  _GUICtrlTreeView_Expand($hTree, $hItem)
Next
_GUICtrlTreeView_SelectItem($hTree, $hItem)

ControlClick('Обзор папок', '', 'Button2')


hsLTi3QduKHei


Код:
>>>> Window <<<<
Title:	Обзор папок
Class:	#32770
Position:	516, 201
Size:	334, 354
Style:	0x94CC08CC
ExStyle:	0x00010101
Handle:	0x00290864

>>>> Control <<<<
Class:	SysTreeView32
Instance:	1
ClassnameNN:	SysTreeView321
Name:	
Advanced (Class):	[CLASS:SysTreeView32; INSTANCE:1]
ID:	100
Text:	Дерево
Position:	16, 58
Size:	286, 210
ControlClick Coords:	145, 34
Style:	0x56014E29
ExStyle:	0x00000000
Handle:	0x00230916

>>>> Mouse <<<<
Position:	685, 323
Cursor ID:	0
Color:	0xFFFFFF

>>>> StatusBar <<<<

>>>> ToolsBar <<<<

>>>> Visible Text <<<<
Дерево
&Создать папку
ОК
Отмена


>>>> Hidden Text <<<<
&Папка:
Modestus
Чтобы увидеть подпапки, щелкните значок рядом с папкой.
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
yakovlev_kll
Код:
#include <GuiTreeView.au3>

DirCreate("C:\music staff\Kontakt 5") ; для выбора в дереве папки должны существовать

$sPath = "Компьютер\C:\music staff\Kontakt 5" ; для раскрытия ветки "Компьютер" путь начинаем с неё
$aPath = StringSplit($sPath, "\")
$hTree = ControlGetHandle("Обзор папок", "", "SysTreeView321")

$hItem = 0
For $i = 1 To $aPath[0]
  $hItem = _GUICtrlTreeView_FindItem($hTree, $aPath[$i], True, $hItem)
  _GUICtrlTreeView_Expand($hTree, $hItem)
  Sleep(50) ; чтобы ветки успевали раскрываться
Next
_GUICtrlTreeView_SelectItem($hTree, $hItem)


Работаю на win 7 x64
Попробуйте запустить скрипт через AutoIt3_x64.exe
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
yakovlev_kll
Проверил на Win10 x64 и Win7 x86. Дерево вызвал с первой же кнопки "Change...". Нормально отработало. На обеих системах запускал, как x86. Запуск через x64 не сработал. Директиву #RequireAdmin не забыли добавить?
 

yakovlev_kll

Новичок
Сообщения
5
Репутация
0
InnI сказал(а):
Директиву #RequireAdmin не забыли добавить?

Нет, вроде всё на месте.

Попробовал код для установки Notepad++ – всё отлично работает!) А вот с моей странной программой какая-то проблема. Мне кажется, что дело в том, что изначально выделено при открытии "Обзора папок". Вот скрин из двух программ
 

Вложения

  • 1.PNG
    1.PNG
    151.1 КБ · Просмотры: 15

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
yakovlev_kll
дело в том, что изначально выделено при открытии "Обзора папок"
Ещё раз обращаю ваше внимание на строчку пути, которая должна начинаться с "Компьютер"
Код:
$sPath = "Компьютер\C:\music staff\Kontakt 5" ; для раскрытия ветки "Компьютер" путь начинаем с неё
 

yakovlev_kll

Новичок
Сообщения
5
Репутация
0
InnI сказал(а):
Ещё раз обращаю ваше внимание на строчку пути, которая должна начинаться с "Компьютер"
Код:
$sPath = "Компьютер\C:\music staff\Kontakt 5" ; для раскрытия ветки "Компьютер" путь начинаем с неё

Спасибо вам огромное, замечание сильно помогло! Сперва не работало, но небольшая задержка в цикле спасла ситуацию)
P.S. Не понял, как повысить вам репутацию за ваше сообщение)

Код:
#RequireAdmin
#include <GuiTreeView.au3>
$compName = "Компьютер\"
$kPath = $compName & "C:\music staff\Kontakt 5"
$vst32Path = $compName & "C:\music staff\VST\Kontakt 5 (x32)"
$vst64Path = $compName & "C:\music staff\VST\Kontakt 5 (x64)"
$delay = 100

;Run (@ScriptDir & '\Kontakt 5.1.0 Setup PC.exe')

$WinName = 'Native Instruments Kontakt 5 - InstallAware Wizard'
WinWait($WinName)
WinActivate($WinName)

ControlClick($WinName, '', 'TButton2')
Sleep($delay)
ControlClick($WinName, '', 'TRzCheckBox1')
Sleep($delay)
ControlClick($WinName, '', 'TButton3')
Sleep($delay)
ControlClick($WinName, '', 'TButton2')
Sleep($delay)
ControlClick($WinName, '', 'TButton4')

$WinName1 = "Обзор папок"
WinWait($WinName1)
WinActivate($WinName1)
$aPath = StringSplit($kPath, "\")
$hTree = ControlGetHandle($WinName1, "", 100)
$hItem = 0
For $i = 1 To $aPath[0]
  $hItem = _GUICtrlTreeView_FindItem($hTree, $aPath[$i], True, $hItem)
  _GUICtrlTreeView_Expand($hTree, $hItem)
  Sleep($delay)
Next
_GUICtrlTreeView_SelectItem($hTree, $hItem)
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
yakovlev_kll
но небольшая задержка в цикле спасла ситуацию
Похоже, вы мой скрипт вообще проигнорировали :(
Код:
Sleep(50) ; чтобы ветки успевали раскрываться
 

yakovlev_kll

Новичок
Сообщения
5
Репутация
0
InnI сказал(а):
Похоже, вы мой скрипт вообще проигнорировали :(
Код:
Sleep(50) ; чтобы ветки успевали раскрываться

Ё-маё.. Простите убогого(
За цитатой даже не удосужился посмотреть на скрипт..

Спасибо вам ещё раз.
 
Верх