Что нового

Прерывание выполнения функции и завершение работы GUI в режиме EventMod

JimmyN

Новичок
Сообщения
20
Репутация
0
Уважаемые знатоки в процессе написания скрипта возникла проблема, пишу в EventMode, соответственно каждой кнопочке назначена своя функция. Некоторые функции цикличные. Когда ни одна из функций не запущена закрыть GUI можно с помощью назначения простенькой функции на кнопочку крестик

Код:
Func Exiting() 
    If @GUI_WINHANDLE = $mainwindow Then  
    Exit (0) 
ElseIf @GUI_WINHANDLE = $clickwindow Then  
    GUISetState(@SW_HIDE, $clickwindow) 
ElseIf @GUI_WINHANDLE = $setwindow Then  
    GUISetState(@SW_HIDE, $setwindow) 
 
EndIf 
EndFunc


Но вот когда какая либо функция запущена такая штука не прокатывает, более того нельзя другие функции тоже не запустить.... Наверняка это делается очень просто. Заранее спасибо)

И ещё вопрос у меня скрипт отправляет сообщения в ListBox, как задать цвет и стиль текста для одного сообщения а не сразу для всего ListBox

сообщения такого типа:

Код:
GUICtrlSetData(ListBoxID, @HOUR & ":" & @MIN & ":" & @SEC & "Текст")


и у меня проблема с функцией ControlSend. Она упорно высылает 2 вместо @, ну и периодически путает другие символы.
я увеличил таймауты

Код:
AutoItSetOption("SendKeyDelay", 20) 
AutoItSetOption("SendKeyDownDelay", 20)


но это не помогло пришлось делать так

Код:
ClipPut($pass) 
Sleep(500) 
ControlSend($winname, "", 0, "{CTRLDOWN}v{CTRLUP}")


может есть какое то более простое решение, (язык по умолчанию английский в системе)
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
JimmyN [?]
когда какая либо функция запущена такая штука не прокатывает
Я кажется тебе дал ответ на руборде, продублирую на всякий случай его тут.
Обычно это делается так (вызов функций с циклом вешается на главный цикл):

Код:
#include <GUIConstantsEx.au3>

Global $iLoop

Opt("GUIOnEventMode", 1)

$hGUI = GUICreate("Test Script", 300, 200)
$nButton = GUICtrlCreateButton("Button", 20, 40, 60, 20)
GUICtrlSetOnEvent(-1, "_Main_Events")
GUISetOnEvent($GUI_EVENT_CLOSE, "_Main_Events")

GUISetState(@SW_SHOW, $hGUI)

While 1
	Sleep(10)
	
	If $iLoop Then
		$iCounter = 0
		
		While $iLoop
			$iCounter += 1
			ConsoleWrite("Looping... " & $iCounter & @LF)
			Sleep(10)
		WEnd
	EndIf
WEnd

Func _Main_Events()
	Switch @GUI_CtrlId
		Case $GUI_EVENT_CLOSE
			Exiting()
		Case $nButton
			$iLoop = Not $iLoop
	EndSwitch
EndFunc

Func Exiting()
	If @GUI_WinHandle = $hGUI Then
		Exit
		;ElseIf @GUI_WINHANDLE = $clickwindow Then
		;    GUISetState(@SW_HIDE, $clickwindow)
		;ElseIf @GUI_WINHANDLE = $setwindow Then
		;    GUISetState(@SW_HIDE, $setwindow)
	EndIf
EndFunc

В отдельную тему, тут тебе не руборд ;)
 
Автор
JimmyN

JimmyN

Новичок
Сообщения
20
Репутация
0
Ого ты вездесущий)))
я уже уточнял вопрос на руборде но продублирую и тут...
Я в этом деле немного новичок нельзя ли пояснить... у меня 3 функции, запускаются тремя разными кнопками. в примере Func _Main_Events() выполняет роль одной из функций или её нужно добавлять помимо, и где в таком случае должен быть основной код функции, а если

Switch @GUI_CtrlId
Case $GUI_EVENT_CLOSE
Exiting()
Case $nButton
$iLoop = Not $iLoop
EndSwitch

нужно добавлять в каждую функцию то что в таком случае указывать в GUISetOnEvent($GUI_EVENT_CLOSE, "_Main_Events")???
 
Автор
JimmyN

JimmyN

Новичок
Сообщения
20
Репутация
0
Вот целиком код скрипта
Код:
#region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_icon=..\WoW_ico_64x64\Trade_Engineering.ico
#AutoIt3Wrapper_Res_Comment=Lazy Bot Relogger
#AutoIt3Wrapper_Res_Fileversion=1.0.0.0
#AutoIt3Wrapper_Res_Language=1049
#endregion ;**** Directives created by AutoIt3Wrapper_GUI ****

AutoItSetOption("WinTitleMatchMode", 4)
;AutoItSetOption("ExpandVarStrings", 0)
AutoItSetOption("SendKeyDelay", 20)
AutoItSetOption("SendKeyDownDelay", 20)


#include <GUIConstants.au3>
#include <EditConstants.au3>
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

Opt("GUIOnEventMode", 1)

$settings_ini = @ScriptDir & "\Settings.ini"
$char_ini = IniRead($settings_ini, "", "$char", "Персонаж")
#region Главное окно
$mainwindow = GUICreate($char_ini, 170, 215)

$settings = GUICtrlCreateButton("Настройки", 10, 155, 70)
$login = GUICtrlCreateButton("Логин", 10, 185, 70)
$relogger = GUICtrlCreateButton("Релоггер", 90, 185, 70)
$list = GUICtrlCreateList("", 2, 2, 166, 150)
$clicker = GUICtrlCreateButton("Кликер", 90, 155, 70)

GUICtrlSetOnEvent($login, "Login")
GUICtrlSetOnEvent($relogger, "Relogger")
GUICtrlSetOnEvent($settings, "Settings")
GUICtrlSetOnEvent($clicker, "Clicker")
GUISetOnEvent($GUI_EVENT_CLOSE, "Exiting")
GUISetState(@SW_SHOW, $mainwindow)

#endregion Главное окно

#region Настройки
$setwindow = GUICreate("Настройки", 260, 300)


$acc_ini = IniRead($settings_ini, "", "$acc", "Логин")
$pass_ini = IniRead($settings_ini, "", "$pass", "Пароль")
$char_ini = IniRead($settings_ini, "", "$char", "Персонаж")
$bnet_ini = IniRead($settings_ini, "", "$bnet", "")
$wowpath_ini = IniRead($settings_ini, "", "$browse_wow", "Путь к WoW")
$botpath_ini = IniRead($settings_ini, "", "$browse_bot", "Путь к Боту")
$bnet_nini = IniRead($settings_ini, "", "$bnet_n", "")
$lvl_ini = IniRead($settings_ini, "", "$lvl", "lvl")

$acc_input = GUICtrlCreateInput($acc_ini, 20, 20, 200, 20)
$pass_input = GUICtrlCreateInput($pass_ini, 20, 50, 200, 20, $ES_PASSWORD)
$wowpath = GUICtrlCreateInput($wowpath_ini, 20, 100, 200, 20)
$browse_button1 = GUICtrlCreateButton("...", 230, 100, 20, 20)
$botpath = GUICtrlCreateInput($botpath_ini, 20, 130, 200, 20)
$browse_button2 = GUICtrlCreateButton("...", 230, 130, 20, 20)
$char_input = GUICtrlCreateInput($char_ini, 20, 180, 120, 20)
$bnet_check = GUICtrlCreateCheckbox("Battlenet", 20, 220)
$bnet_ncheck = GUICtrlCreateCombo("", 100, 220, 40, 20)
$save = GUICtrlCreateButton("Сохранить", 140, 260, 80, 20)
GUICtrlSetData(16, "1|2|3|4|5", $bnet_nini)
$lvl_input = GUICtrlCreateInput($lvl_ini, 170, 180, 50, 20)

GUICtrlSetState(15, $bnet_ini)
GUISetOnEvent($GUI_EVENT_CLOSE, "Exiting")
GUICtrlSetOnEvent($browse_button1, "WoW_path")
GUICtrlSetOnEvent($browse_button2, "Bot_path")
GUICtrlSetOnEvent($save, "Save")

#endregion Настройки

#region Кликер
$clickwindow = GUICreate("Кликер", 141, 70, 258, 130)
$key = GUICtrlCreateInput("Кнопка", 10, 8, 50, 20)
$deley = GUICtrlCreateInput("Таймаут", 80, 8, 50, 20)
$start = GUICtrlCreateButton("Старт", 10, 40, 50, 20, $WS_GROUP)
$stop = GUICtrlCreateButton("Стоп", 80, 40, 50, 20, $WS_GROUP)

GUISetOnEvent($GUI_EVENT_CLOSE, "Exiting")
#endregion Кликер

#region Переменные
$acc = GUICtrlRead($acc_input)
$pass = GUICtrlRead($pass_input)
$char = GUICtrlRead($char_input)
$bnet = GUICtrlRead($bnet_check)
$browse_wow = GUICtrlRead($wowpath)
$browse_bot = GUICtrlRead($botpath)
$bnet_n = GUICtrlRead($bnet_ncheck)
$lvl = GUICtrlRead($lvl_input)
$winname = $acc
$str = StringLen($char)
$str2 = StringLeft($char, $str - 2)
$id = $str2 & " - " & $lvl
#endregion Переменные



Func WoW_path()
	$browse_wow = FileOpenDialog("Open", "C:\", "(*.exe)", 1)
	GUICtrlDelete($wowpath)
	$path_input = GUICtrlCreateInput($browse_wow, 20, 100, 200, 20)
EndFunc   ;==>WoW_path

Func Bot_path()
	$browse_bot = FileOpenDialog("Open", "C:\", "(*.exe)", 1)
	GUICtrlDelete($botpath)
	$path_input = GUICtrlCreateInput($browse_bot, 20, 130, 200, 20)
EndFunc   ;==>Bot_path

Func Save()
	$acc = GUICtrlRead($acc_input)
	$pass = GUICtrlRead($pass_input)
	$char = GUICtrlRead($char_input)
	$bnet = GUICtrlRead($bnet_check)
	$browse_wow = GUICtrlRead($wowpath)
	$browse_bot = GUICtrlRead($botpath)
	$bnet_n = GUICtrlRead($bnet_ncheck)
	$lvl = GUICtrlRead($lvl_input)
	$winname = $acc


	IniWrite($settings_ini, "", "$acc", $acc)
	IniWrite($settings_ini, "", "$pass", $pass)
	IniWrite($settings_ini, "", "$char", $char)
	IniWrite($settings_ini, "", "$bnet", $bnet)
	IniWrite($settings_ini, "", "$browse_wow", $browse_wow)
	IniWrite($settings_ini, "", "$browse_bot", $browse_bot)
	IniWrite($settings_ini, "", "$bnet_n", $bnet_n)
	IniWrite($settings_ini, "", "$lvl", $lvl)

	GUISetState(@SW_HIDE, $setwindow)

EndFunc   ;==>Save

Func Settings()
	GUISwitch($setwindow)
	GUISetState(@SW_SHOW, $setwindow)
EndFunc   ;==>Settings

Func Clicker()
	GUISwitch($clickwindow)
	GUISetState(@SW_SHOW, $clickwindow)
EndFunc   ;==>Clicker

Func Exiting()
	If @GUI_WinHandle = $mainwindow Then
		Exit (0)
	ElseIf @GUI_WinHandle = $clickwindow Then
		GUISetState(@SW_HIDE, $clickwindow)
	ElseIf @GUI_WinHandle = $setwindow Then
		GUISetState(@SW_HIDE, $setwindow)

	EndIf
EndFunc   ;==>Exiting

Func Login()

	GUICtrlSetData(6, @HOUR & ":" & @MIN & ":" & @SEC & "   Запуск WoW")
	Run($browse_wow)
	Sleep(5000)
	WinSetTitle("World of Warcraft", "", $winname)
	Sleep(100)
	WinMove($winname, "", 0, 0, 328, 270)
	Sleep(5000)
	GUICtrlSetData(6, @HOUR & ":" & @MIN & ":" & @SEC & "   Логин")
	Sleep(1000)
	ClipPut($acc)
	Sleep(500)
	ControlSend($winname, "", 0, "{CTRLDOWN}v{CTRLUP}")
	Sleep(1000)
	ControlSend($winname, "", "", "{TAB}")
	Sleep(1000)
	ClipPut($pass)
	Sleep(500)
	ControlSend($winname, "", 0, "{CTRLDOWN}v{CTRLUP}")
	Sleep(1000)
	ControlSend($winname, "", "", "{ENTER}")
	Sleep(3000)

	If $bnet = $GUI_CHECKED Then
		If $bnet_n = 1 Then
			ControlSend($winname, "", "", "{ENTER}")
			Sleep(3000)
		ElseIf $bnet_n = 2 Then
			ControlSend($winname, "", "", "{DOWN}")
			Sleep(1000)
			ControlSend($winname, "", "", "{ENTER}")
		ElseIf $bnet_n = 3 Then
			ControlSend($winname, "", "", "{DOWN 2}")
			Sleep(1000)
			ControlSend($winname, "", "", "{ENTER}")
		ElseIf $bnet_n = 4 Then
			ControlSend($winname, "", "", "{DOWN 3}")
			Sleep(1000)
			ControlSend($winname, "", "", "{ENTER}")
		ElseIf $bnet_n = 5 Then
			ControlSend($winname, "", "", "{DOWN 4}")
			Sleep(1000)
			ControlSend($winname, "", "", "{ENTER}")
		EndIf
	EndIf

	Sleep(10000)
	GUICtrlSetData(6, @HOUR & ":" & @MIN & ":" & @SEC & "   Загрузка персонажа")
	Sleep(1000)
	ControlSend($winname, "", "", "{ENTER}")
	Sleep(30000)
	GUICtrlSetData(6, @HOUR & ":" & @MIN & ":" & @SEC & "   Запуск бота")
	Sleep(1000)
	Run($browse_bot)
	;ControlClick("Select process", "Attach", "[CLASS:WindowsForms10.Window.8.app.0.378734a; INSTANCE:2]","left")
	;Sleep(5000)
	GUICtrlSetData(6, @HOUR & ":" & @MIN & ":" & @SEC & "   Выберите процесс")
	WinWait("Ready", $char)
	Sleep(5000)
	$title = WinGetHandle("[CLASS:WindowsForms10.Window.8.app.0.378734a]", $id)
	Sleep(1000)
	ControlClick($title, "Start botting", "[CLASS:WindowsForms10.Window.8.app.0.378734a; INSTANCE:13]", "left")
	Sleep(1000)
	GUICtrlSetData(6, @HOUR & ":" & @MIN & ":" & @SEC & "   Готово")
	Sleep(1000)

EndFunc   ;==>Login

Func Relogger()

	While 1
	GUICtrlSetData(6, @HOUR & ":" & @MIN & ":" & @SEC & "   Релоггер запущен")
	Sleep(1000)

		Do
			Sleep(100)
			$var = Ping("www.mail.ru", 1000)
		Until $var

		$title2 = WinGetHandle("[CLASS:WindowsForms10.Window.8.app.0.378734a]", $id)
		$line = ControlCommand($title2, "", "[CLASS:WindowsForms10.RichEdit20W.app.0.378734a; INSTANCE:1]", "GetLineCount", "")
		$txt = ControlCommand($title2, "", "[CLASS:WindowsForms10.RichEdit20W.app.0.378734a; INSTANCE:1]", "GetLine", $line - 1)
		$result = StringRegExp($txt, "Bot stopped", 0)
		$result2 = StringRegExp($txt, "Please ress before starting the bot", 0)
		$result3 = StringRegExp($txt, "this is not optional!", 0)
		$result4 = StringRegExp($txt, "Please enter the world", 0)
		$result5 = StringRegExp($txt, "Attached", 0)
		$result6 = StringRegExp($txt, "Please login", 0)

		If $result3 = 1 Then
			$title2 = WinGetHandle("[CLASS:WindowsForms10.Window.8.app.0.378734a]", $id)
			ControlClick($title2, "Stop botting", "[CLASS:WindowsForms10.Window.8.app.0.378734a; INSTANCE:13]", "left")
			GUICtrlSetData(6, @HOUR & ":" & @MIN & ":" & @SEC & "   Перезапуск")
			ControlClick($title2, "Start botting", "[CLASS:WindowsForms10.Window.8.app.0.378734a; INSTANCE:13]", "left")
		ElseIf $result = 1 Then
			$title2 = WinGetHandle("[CLASS:WindowsForms10.Window.8.app.0.378734a]", $id)
			GUICtrlSetData(6, @HOUR & ":" & @MIN & ":" & @SEC & "   Запуск бота")
			ControlClick($title2, "Start botting", "[CLASS:WindowsForms10.Window.8.app.0.378734a; INSTANCE:13]", "left")
		ElseIf $result4 = 1 Or $result6 = 1 Then
			$title2 = WinGetHandle("[CLASS:WindowsForms10.Window.8.app.0.378734a]", $id)
			GUICtrlSetData(6, @HOUR & ":" & @MIN & ":" & @SEC & "   Дисконект")
			Sleep(5000)
			ControlSend($winname, "", "", "{ENTER}")
			Sleep(1000)
			ControlSend($winname, "", "", "{Backspace 50}")
			Sleep(5000)
			GUICtrlSetData(6, @HOUR & ":" & @MIN & ":" & @SEC & "   Логин")
			Sleep(1000)
			ClipPut($acc)
			Sleep(500)
			ControlSend($winname, "", 0, "{CTRLDOWN}v{CTRLUP}")
			Sleep(1000)
			ControlSend($winname, "", "", "{TAB}")
			Sleep(1000)
			ClipPut($pass)
			Sleep(500)
			ControlSend($winname, "", 0, "{CTRLDOWN}v{CTRLUP}")
			Sleep(1000)

			If $bnet = $GUI_CHECKED Then
				If $bnet_n = 1 Then
					ControlSend($winname, "", "", "{ENTER}")
					Sleep(3000)
				ElseIf $bnet_n = 2 Then
					ControlSend($winname, "", "", "{DOWN}")
					Sleep(1000)
					ControlSend($winname, "", "", "{ENTER}")
				ElseIf $bnet_n = 3 Then
					ControlSend($winname, "", "", "{DOWN 2}")
					Sleep(1000)
					ControlSend($winname, "", "", "{ENTER}")
				ElseIf $bnet_n = 4 Then
					ControlSend($winname, "", "", "{DOWN 3}")
					Sleep(1000)
					ControlSend($winname, "", "", "{ENTER}")
				ElseIf $bnet_n = 5 Then
					ControlSend($winname, "", "", "{DOWN 4}")
					Sleep(1000)
					ControlSend($winname, "", "", "{ENTER}")
				EndIf
			EndIf

			ControlSend($winname, "", "", "{ENTER}")
			Sleep(10000)
			GUICtrlSetData(6, @HOUR & ":" & @MIN & ":" & @SEC & "   Загрузка персонажа")
			Sleep(1000)
			ControlSend($winname, "", "", "{ENTER}")
			Sleep(30000)

		ElseIf $result5 = 1 Then
			$title2 = WinGetHandle("[CLASS:WindowsForms10.Window.8.app.0.378734a]", $id)
			GUICtrlSetData(6, @HOUR & ":" & @MIN & ":" & @SEC & "   Запуск бота")
			ControlClick($title2, "Start botting", "[CLASS:WindowsForms10.Window.8.app.0.378734a; INSTANCE:13]", "left")
		EndIf
	WEnd

EndFunc   ;==>Relogger

While 1
	Sleep(10)
WEnd

Мне нужно организовать чтоб во время выполнения одной из функций во первых можно было запустить другую а во вторых выйти вообще из GUI при нажатии крестика... уже 2 дня бьюсь так досих пор и не понял как сделать.

И ещё он у меня ругается на @GUI_CtrlId говорит неизвестный макрос хотя #include <GUIConstantsEx.au3>
включен
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
JimmyN [?]
Вот целиком код скрипта
Вот тебе поправка для этого скрипта:

Код:
...

Opt("GUIOnEventMode", 1)

Global $iRelogger

...

GUICtrlSetOnEvent($relogger, "Relogger_Event")

...

While 1
	Sleep(10)
	
	If $iRelogger Then
		$iRelogger = 0
		Relogger()
	EndIf
WEnd

...

Func Relogger_Event()
	$iRelogger = 1
EndFunc

Func Relogger()
	While 1
		GUICtrlSetData(6, @HOUR & ":" & @MIN & ":" & @SEC & "   Релоггер запущен")
		Sleep(1000)
		
		...
	WEnd
EndFunc

...


Как видишь, я всего лишь добавил глобальную переменную для выноса функций Relogger в главный цикл. А при назначений события использовал дополнительную функцию Relogger_Event, которая и задаёт переменной $iRelogger значение 1, что указывает на вызов функций Relogger из цикла (If $iRelogger Then ...)
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
JimmyN [?]
он у меня ругается на @GUI_CtrlId говорит неизвестный макрос
Этот макрос нужно использовать исключительно в функций события (OnEvent), если функция события “делится” другими обработчиками, то можно проделать трюк с Execute("@GUI_CTRLID").
 
Автор
JimmyN

JimmyN

Новичок
Сообщения
20
Репутация
0
Хех как всё просто спс огромное.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
JimmyN сказал(а):
извините что в личку но у меня возник ещё один вопрос, как теперь во всё это добавить чтоб при нажатии паузы останавливались все запущенные скрипты а при повторном нажатии запускались с того место где была пауза?
...
Так трудно было его здесь спросить? оно относится к этой теме прямым образом.

Вот так примерно:
Код:
...

HotKeySet("{Pause}", "_PauseScript")
Opt("GUIOnEventMode", 1)

Global $iRelogger
Global $iPaused

...

GUICtrlSetOnEvent($relogger, "Relogger_Event")

...

While 1
    Sleep(10)
    
    If $iRelogger Then
        $iRelogger = 0
        Relogger()
    EndIf
WEnd

...

Func Relogger_Event()
    $iRelogger = 1
EndFunc

Func Relogger()
    While 1
        GUICtrlSetData(6, @HOUR & ":" & @MIN & ":" & @SEC & "   Релоггер запущен")
		
		_CheckPause() ;Это нужно ставить перед каждой задержкой, чтобы проверить не поставлен ли скрипт на паузу
        Sleep(1000)
        
        ...
    WEnd
EndFunc

Func _PauseScript()
	$iPaused = Not $iPaused
EndFunc

Func _CheckPause()
	While $iPaused
		Sleep(10)
	WEnd
EndFunc

...
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
JimmyN

{CodeWarn}
 
Автор
JimmyN

JimmyN

Новичок
Сообщения
20
Репутация
0
Спасибо хоткей работает на ура а вот если ту же самую функцию назначить на кнопку в GUI то не работает... в моем случае будет запускаться не одно окно программы и хоткей меня не очень то устраивает.
 
Верх