Пользователь
Сообщения: 67
Благодарности: 13
|
Профиль
|
Отправить PM
| Цитировать
Может кому понадобится... Для собственных нужд писал, так что придирки к "культурности кода" не принимаются. Ничего сложного, прога собирает заголовки и (выбираемый пользователем из выводимого в листбоксе набора строк) уникальный текст окна для идентификации, а также идентификаторы контролов, может брать текст из edit боксов, вставлять его (для работы с кейгенами), распознает текст и переменные (если перед словом поставить $), закрывать окна, запускать файлы, кликать по координатам (не дорабатывал эту фичу за ненадобностью). После окончания работы установщика жмем Esc, получаем готовый скрипт автоустановщика, в редких случаях его приходится дорабатывать ручками. Нужного окна дождется автоматом, нажмет где надо... мне такого функционала хватает, а там смотрите сами.
Код:
#include <Misc.au3>
#include <GUIConstants.au3>
Opt("TrayIconDebug",1)
;Opt("MouseCoordMode",0)
HotKeySet("{ESC}","texit")
$dll = DllOpen("user32.dll")
$file = FileOpen("file.au3", 2)
$written_to_file_text=""
$progstatus=0
$filepath=""
$write_on_exit_text=""
$_texttopaste=""
$haos=0
$FilenameOnExitChange=""
$input_variable_got=""
$current_mpos=0
$as_is=0
;fop()
;wr(";run('')")
TrayTip("","ctrl - начало записи"&@lf&"pause - пауза/возобновление записи"&@lf&"shift - диалог открытия файла"&@lf&"esc - завершение записи",1)
while not _IsPressed("11", $dll)
sleep(10)
WEnd
TrayTip("","ЗАПИСЫВАЕМ",1)
;---------------------------------------------------------------------------------------------------------------------
While 1
if _IsPressed("01", $dll) Then ;01-lmb 02-rmb ctrltext & classn 11-ctrl 10-shift
$current_mpos=MouseGetPos()
$wtt=WinGetTitle("")
$wgt=WinGetText("")
$cgf=ControlGetFocus("")
sleep(200)
$wgt=repl($wgt) ;выбор уникального текста с параметрами пользователем
Select
case $progstatus=0 ;кликнуть
if $cgf<>"" then wr("cl('"&$wtt&"','"&$wgt&"','"&$cgf&"')")
case $progstatus=2 ;ждать
wr("wa('"&$wtt&"','"&$wgt&"')")
case $progstatus=3 ;взять
if $cgf<>"" then wr("wa('"&$wtt&"','"&$wgt&"')"&@lf&$input_variable_got&"=ControlGetText('"&$wtt&"','"&$wgt&"','"&$cgf&"')")
case $progstatus=4 ;вставить
if $cgf<>"" And StringLeft($_texttopaste,1)= "$" then wr("wa('"&$wtt&"','"&$wgt&"')"&@lf&"ControlSetText('"&$wtt&"','"&$wgt&"','"&$cgf&"',"&$_texttopaste&")"&";ВСТАВИТЬ ТЕКСТ СЮДА")
if $cgf<>"" And StringLeft($_texttopaste,1)<>"$" then wr("wa('"&$wtt&"','"&$wgt&"')"&@lf&"ControlSetText('"&$wtt&"','"&$wgt&"','"&$cgf&"','"&$_texttopaste&"')"&";ВСТАВИТЬ ТЕКСТ СЮДА")
case $progstatus=10 ;окно возможно
if $cgf<>"" then $write_on_exit_text&=@tab&@tab&"if WinExists('"&$wtt&"','"&$wgt&"') then ControlClick('"&$wtt&"','"&$wgt&"','"&$cgf&"')"&@lf
case $progstatus=12 ;закрыть окно
wr("wa('"&$wtt&"','"&$wgt&"')"&@lf&"WinClose('"&$wtt&"','"&$wgt&"')")
WinClose($wtt,$wgt)
case $progstatus=15;Отмена блока
Sleep(1);ExitLoop
case $progstatus=20;Кликаем по координатам мыши (при возможном появлении окна не сработает. отладить в будущем совместную работу опций)
wr("wa('"&$wtt&"','"&$wgt&"')"&@lf&"MouseClick('left',"&$current_mpos[0]&","&$current_mpos[1]&",1,0)")
EndSelect
;TrayTip($wtt,$cgf,1)
$progstatus=0
$as_is=0
EndIf
if _IsPressed("10",$dll) Then fop()
if _IsPressed("13",$dll) Then pause()
if _IsPressed("1b", $dll) Then texit();ExitLoop ;esc
sleep(10)
WEnd
;---------------------------------------------------------------------------------------------------------------------
func texit() ;завершение
wr("Func wa($tx1, $tx2)")
wr(" While Not WinExists($tx1, $tx2)")
wr($write_on_exit_text&" ;if WinExists("","") then WinClose("","")")
wr(" Sleep(1) ")
wr(" WEnd ")
wr(" ;WinActivate($tx1, $tx2)")
wr("EndFunc")
wr("Func cl($tx1, $tx2,$classn)")
wr(" wa($tx1, $tx2)")
wr(" ControlClick($tx1, $tx2,$classn)")
wr("EndFunc")
DllClose($dll)
FileClose($file)
if $FilenameOnExitChange<>"" Then
if MsgBox(4,"","Переименовать файл скрипта?")=6 Then
$FilenameOnExitChange=StringTrimRight($FilenameOnExitChange,4)
FileMove("file.au3",$FilenameOnExitChange&"_au3.au3",1)
EndIf
if MsgBox(4,"","Компилировать скрипт?")=6 Then
TrayTip("","Compiling in process",1)
RunWait(@ProgramFilesDir&'\AutoIt3\Aut2Exe\Aut2exe.exe /in '&@ScriptDir&'\'&$FilenameOnExitChange&'_au3.au3')
EndIf
EndIf
exit
EndFunc
Func fop()
$filepath=FileOpenDialog("",@WorkingDir,"Программы (*.exe)")
if Not @error And StringLeft($filepath,9)<>"c:\Progra" then
$filepath=fred($filepath)
wr("run('"&$filepath&"')")
run($filepath)
Else
wr("run('"&$filepath&"')")
run($filepath)
EndIf
if $FilenameOnExitChange="" Then $FilenameOnExitChange=$filepath
$filepath=""
EndFunc
Func fred($ppp)
$ppp_=""
while StringRight($ppp,1)<>"\"
$ppp_=StringRight($ppp,1)&$ppp_
$ppp=StringTrimRight($ppp,1)
WEnd
Return $ppp_
EndFunc
Func pause()
TrayTip("","ПАУЗА",1)
sleep(300)
while 1
if _IsPressed("13",$dll) OR $filepath<>"" Then ExitLoop
sleep(10)
WEnd
TrayTip("","ЗАПИСЫВАЕМ",1)
sleep(300)
EndFunc
Func wr($text_to_write)
if $written_to_file_text<>$text_to_write then
FileWrite($file,$text_to_write&@LF)
$written_to_file_text=$text_to_write
EndIf
EndFunc
Func wa($tx1, $tx2)
While Not WinExists($tx1, $tx2)
Sleep(1)
WEnd
EndFunc
Func cl($tx1, $tx2,$classn)
wa($tx1, $tx2)
ControlClick($tx1, $tx2,$classn)
EndFunc
;------------------------------------------------------------------------------------------------------GUI start
func repl($whole_window_text)
$tempstr=$whole_window_text
$tempstr=StringReplace($tempstr,@crlf,"|")
$tempstr=StringReplace($tempstr,@cr,"|")
$tempstr=StringReplace($tempstr,@lf,"|")
GUICreate("Выбери параметры и уникальный текст окна",310,350,-1,-1,-1,$WS_EX_TOPMOST)
$ctrl=GUICtrlCreateLabel($cgf,0,5)
$butt_cancel_block=GUICtrlCreateButton("Отмена блока",220,0,90)
$butt_cancel_radio=GUICtrlCreateButton("Очистка опций",220,25,90)
$radio_wa=GUICtrlCreateRadio("Просто ждать появления этого окна",0,25)
$radio_get=GUICtrlCreateRadio("Читать отсюда текст",0,50)
$input_variable_gui_get=GUICtrlCreateInput("",150,50)
$radio_set=GUICtrlCreateRadio("Вставить сюда текст",0,75)
$texttopaste=GUICtrlCreateInput("",150,75)
$radio_possible=GUICtrlCreateRadio("Появление окна возможно, но необязательно",0,100)
$radio_close=GUICtrlCreateRadio("Закрыть окно",0,125)
$checkb_haos=GUICtrlCreateCheckbox("Произвольный порядок",120,125)
$checkb_mpos=GUICtrlCreateCheckbox("Mpos",263,125)
$butt_ok=GUICtrlCreateButton("Как есть",165,0)
$listb=GUICtrlCreateList("",0,150,300,300,$LBS_USETABSTOPS)
GUICtrlSetState($texttopaste,$GUI_HIDE)
GUICtrlSetState($input_variable_gui_get,$GUI_HIDE)
GUISetState(@SW_SHOW)
GUICtrlSetData($listb,$tempstr)
if $haos=1 then GUICtrlSetState ($checkb_haos,$GUI_CHECKED)
if $haos<>1 then GUICtrlSetState ($checkb_haos,$GUI_UNCHECKED)
$msg=0
While $msg <> $GUI_EVENT_CLOSE
$msg = GUIGetMsg()
Select
case $msg=$listb
;MsgBox(0,"",GUICtrlRead($listb))
$whole_window_text=GUICtrlRead($listb)
ExitLoop
case $msg=$butt_cancel_block
$progstatus=15
ExitLoop
case $msg=$butt_cancel_radio
GUICtrlSetState ($radio_wa,$GUI_UNCHECKED)
GUICtrlSetState ($radio_get,$GUI_UNCHECKED)
GUICtrlSetState ($radio_set,$GUI_UNCHECKED)
GUICtrlSetState ($radio_possible,$GUI_UNCHECKED)
GUICtrlSetState ($radio_close,$GUI_UNCHECKED)
GUICtrlSetState ($checkb_haos,$GUI_UNCHECKED)
GUICtrlSetState ($checkb_mpos,$GUI_UNCHECKED)
case $msg=$radio_set
GUICtrlSetState($texttopaste,$GUI_SHOW)
case $msg=$radio_get
GUICtrlSetState($input_variable_gui_get,$GUI_SHOW)
case $msg=$butt_ok
$as_is=1
ExitLoop
EndSelect
WEnd
if $progstatus<>15 Then
if GUICtrlRead($radio_wa)=1 then $progstatus=2
if GUICtrlRead($radio_get)=1 then $progstatus=3
if GUICtrlRead($radio_get)=1 then $input_variable_got=GUICtrlRead($input_variable_gui_get)
if GUICtrlRead($radio_set)=1 then $progstatus=4
if GUICtrlRead($radio_set)=1 then $_texttopaste=GUICtrlRead($texttopaste)
if GUICtrlRead($radio_possible)=1 then $progstatus=10
if GUICtrlRead($radio_close)=1 then $progstatus=12
if GUICtrlRead($checkb_haos)=1 then $haos=1
if GUICtrlRead($checkb_haos)<>1 then $haos=0
if GUICtrlRead($checkb_mpos)=1 then $progstatus=20
if $haos=1 Then $progstatus=10
EndIf
GUIDelete()
$tempstr=""
While StringLeft($whole_window_text,1)<>"" And StringLeft($whole_window_text,1)<>"'" And StringLeft($whole_window_text,1)<>'"' ;чистим уникальный текст от недопустимых символов
$tempstr&=StringLeft($whole_window_text,1)
$whole_window_text=StringTrimLeft($whole_window_text,1)
WEnd
$whole_window_text=$tempstr
if $as_is=1 Then $whole_window_text=""
return $whole_window_text
EndFunc
;----------------------------------------------------------------------------------------------------------------------GUI end
Ctrl - начало слежения за установкой (если нажатие не нужно записывать - жми кнопку "отмена блока")
Shift - открытие файла инстальника, кейгена и т.п. необходимого в процессе установки.
Для создания автоустанавливающихся комплектов я использую отдельную виртуальную машину, чтобы не отвлекаться в процессе создания автоустановщика, чего и вам советую...
|