Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Название темы: Генератор Autoit script
Показать сообщение отдельно

Пользователь


Сообщения: 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 - открытие файла инстальника, кейгена и т.п. необходимого в процессе установки.
Для создания автоустанавливающихся комплектов я использую отдельную виртуальную машину, чтобы не отвлекаться в процессе создания автоустановщика, чего и вам советую...

-------
Информация для размышления
Такому в вузах не научат


Отправлено: 00:06, 09-07-2009 | #8

Название темы: Генератор Autoit script