Что нового

запуск и остановка действия работы

benxomi

Новичок
Сообщения
37
Репутация
0
Вот Gui
Код:
#include <GUIConstants.au3>

Opt("GUIOnEventMode", 1)

$mainwindow = GUICreate("Бета версия", 600, 400)
GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked")
$idFileMenu1 = GUICtrlCreateMenu("Меню 1")
$idFileMenu2 = GUICtrlCreateMenu("Меню 2")
GUICtrlSetOnEvent(-1, "idFileMenu2")
$idFileMenu3 = GUICtrlCreateMenu("Меню 3")
$idFileItem1 = GUICtrlCreateMenuItem("Номер 1", $idFileMenu1)
GUICtrlSetOnEvent(-1, "idFileItem1")
$idFileItem2 = GUICtrlCreateMenuItem("Номер 2", $idFileMenu1)
GUICtrlSetOnEvent(-1, "idFileItem2")
$idFileItem3 = GUICtrlCreateMenuItem("Номер 3", $idFileMenu1)
GUICtrlSetOnEvent(-1, "idFileItem3")
$idFileItem4 = GUICtrlCreateMenuItem("Номер 4)", $idFileMenu1)
GUICtrlSetOnEvent(-1, "idFileItem4")
$idFileItem5 = GUICtrlCreateMenuItem("Номер 5", $idFileMenu1)
;GUICtrlSetOnEvent(-1, "idFileItem5")
$idFileItem6 = GUICtrlCreateMenuItem("Номер 6", $idFileMenu1)
;GUICtrlSetOnEvent(-1, "idFileItem6")
$idFileItem7 = GUICtrlCreateMenuItem("Номер 7", $idFileMenu1)
;GUICtrlSetOnEvent(-1, "idFileItem7")
$idFileItem8 = GUICtrlCreateMenuItem("Номер 8", $idFileMenu1)
;GUICtrlSetOnEvent(-1, "idFileItem8")
$idFileItem9 = GUICtrlCreateMenuItem("Номер 9", $idFileMenu1)
;GUICtrlSetOnEvent(-1, "idFileItem9")
$idFileItem10 = GUICtrlCreateMenuItem("Номер 10", $idFileMenu1)
;GUICtrlSetOnEvent(-1, "idFileItem10")

$id0 = GUICtrlCreateGroup("Действие 1", 16, 35, 200, 115)
$id1 = GUICtrlCreateCheckbox("Действие 2", 16, 50, 255, 17)
$id2 = GUICtrlCreateCheckbox("Действие 3", 16, 70, 125, 17)
$id3 = GUICtrlCreateCheckbox("Действие 4", 16, 90, 125, 17)
$id4 = GUICtrlCreateCheckbox("Действие 5", 16, 110, 125, 17)
$id5 = GUICtrlCreateCheckbox("Действие 6", 16, 130, 125, 17)

$id6 = GUICtrlCreateGroup("Действие 7", 300, 35, 200, 115)
$id7 = GUICtrlCreateCheckbox("Действие 8", 300, 50, 255, 17)
$id8 = GUICtrlCreateCheckbox("Действие 9", 300, 70, 255, 17)
$id9 = GUICtrlCreateCheckbox("Действие 10", 300, 90, 255, 17)
$id10 = GUICtrlCreateCheckbox("Действие 11", 300, 110, 255, 17)



$okbutton1 = GUICtrlCreateButton("Старт", 70, 50, 60)
GUICtrlSetState(-1, $GUI_HIDE)
GUICtrlSetOnEvent(-1, "OKButton1")
$okbutton2 = GUICtrlCreateButton("Стоп", 210, 50, 60)
GUICtrlSetState(-1, $GUI_HIDE)
GUICtrlSetOnEvent(-1, "OKButton2")
GUISetState(@SW_SHOW)

While 1
  Sleep(1000)
WEnd

Func idFileItem1()
  GUICtrlSetState($okbutton1, $GUI_SHOW)
  GUICtrlSetState($okbutton2, $GUI_SHOW)
  GUICtrlSetState($okbutton3, $GUI_HIDE)
  GUICtrlSetState($okbutton4, $GUI_HIDE)
  GUICtrlSetState($id0, $GUI_HIDE)
  GUICtrlSetState($id1, $GUI_HIDE)
  GUICtrlSetState($id2, $GUI_HIDE)
  GUICtrlSetState($id3, $GUI_HIDE)
  GUICtrlSetState($id4, $GUI_HIDE)
  GUICtrlSetState($id5, $GUI_HIDE)
  GUICtrlSetState($id6, $GUI_HIDE)
  GUICtrlSetState($id7, $GUI_HIDE)
  GUICtrlSetState($id8, $GUI_HIDE)
  GUICtrlSetState($id9, $GUI_HIDE)
  GUICtrlSetState($id10, $GUI_HIDE)
EndFunc

Func idFileItem2()
  GUICtrlSetState($okbutton1, $GUI_SHOW)
  GUICtrlSetState($okbutton2, $GUI_SHOW)
  GUICtrlSetState($okbutton3, $GUI_HIDE)
  GUICtrlSetState($okbutton4, $GUI_HIDE)
  GUICtrlSetState($id0, $GUI_HIDE)
  GUICtrlSetState($id1, $GUI_HIDE)
  GUICtrlSetState($id2, $GUI_HIDE)
  GUICtrlSetState($id3, $GUI_HIDE)
  GUICtrlSetState($id4, $GUI_HIDE)
  GUICtrlSetState($id5, $GUI_HIDE)
  GUICtrlSetState($id6, $GUI_HIDE)
  GUICtrlSetState($id7, $GUI_HIDE)
  GUICtrlSetState($id8, $GUI_HIDE)
  GUICtrlSetState($id9, $GUI_HIDE)
  GUICtrlSetState($id10, $GUI_HIDE)
EndFunc

Func idFileItem3()
  GUICtrlSetState($okbutton1, $GUI_SHOW)
  GUICtrlSetState($okbutton2, $GUI_SHOW)
  GUICtrlSetState($okbutton3, $GUI_SHOW)
  GUICtrlSetState($okbutton4, $GUI_HIDE)
  GUICtrlSetState($id0, $GUI_HIDE)
  GUICtrlSetState($id1, $GUI_HIDE)
  GUICtrlSetState($id2, $GUI_HIDE)
  GUICtrlSetState($id3, $GUI_HIDE)
  GUICtrlSetState($id4, $GUI_HIDE)
  GUICtrlSetState($id5, $GUI_HIDE)
  GUICtrlSetState($id6, $GUI_HIDE)
  GUICtrlSetState($id7, $GUI_HIDE)
  GUICtrlSetState($id8, $GUI_HIDE)
  GUICtrlSetState($id9, $GUI_HIDE)
  GUICtrlSetState($id10, $GUI_HIDE)
EndFunc

Func idFileItem4()
  GUICtrlSetState($okbutton1, $GUI_SHOW)
  GUICtrlSetState($okbutton2, $GUI_SHOW)
  GUICtrlSetState($okbutton3, $GUI_SHOW)
  GUICtrlSetState($okbutton4, $GUI_SHOW)
  GUICtrlSetState($id0, $GUI_HIDE)
  GUICtrlSetState($id1, $GUI_HIDE)
  GUICtrlSetState($id2, $GUI_HIDE)
  GUICtrlSetState($id3, $GUI_HIDE)
  GUICtrlSetState($id4, $GUI_HIDE)
  GUICtrlSetState($id5, $GUI_HIDE)
  GUICtrlSetState($id6, $GUI_HIDE)
  GUICtrlSetState($id7, $GUI_HIDE)
  GUICtrlSetState($id8, $GUI_HIDE)
  GUICtrlSetState($id9, $GUI_HIDE)
  GUICtrlSetState($id10, $GUI_HIDE)
EndFunc

Func idFileMenu2()
  GUICtrlSetState($id0, $GUI_SHOW)
  GUICtrlSetState($id1, $GUI_HIDE)
  GUICtrlSetState($id2, $GUI_HIDE)
  GUICtrlSetState($id3, $GUI_HIDE)
  GUICtrlSetState($id4, $GUI_HIDE)
  GUICtrlSetState($id5, $GUI_HIDE)
EndFunc

Func CLOSEClicked()
  Exit
EndFunc
Как сделать, что бы кнопка старт и стоп(в каждом номере), воспроизводила работу действия и остановку не закрывая окна
Вот что надо воспроизводить
Код:
While 1
$left='3'
$top='51'
$right='1116'
$bottom='758'
$color='0xF3970C'
$hwnd=''
Opt("PixelCoordMode", 2)
$pos = PixelSearch ( $left, $top, $right, $bottom, $color, $hwnd)
If Not @error Then
    ControlClick("","","[CLASS:; INSTANCE:1]","left",1,$pos[0],$pos[1])
EndIf
Sleep(3000)
WEnd
 
Автор
B

benxomi

Новичок
Сообщения
37
Репутация
0
Код:
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

Opt("TrayOnEventMode", 1)
Opt("TrayMenuMode", 3)
TrayCreateItem("Выход")
TrayItemSetOnEvent(-1, "On_Exit")

$Okno = GUICreate("Окно", 315, 182, 192, 124)
$Button1 = GUICtrlCreateButton("Старт", 48, 80, 75, 25)
$Button2 = GUICtrlCreateButton("Стоп", 168, 80, 75, 25)
GUISetState(@SW_SHOW)

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $Button2
            Exit
        Case $Button1
            While 1
$left='3';Левая координата области для поиска
$top='51';Верхняя
$right='1116';Праввая
$bottom='758';нижняя
$color='0xF3970C';Цвет пиксела
$hwnd=''
Opt("PixelCoordMode", 2)
$pos = PixelSearch ( $left, $top, $right, $bottom, $color, $hwnd)
ControlClick("","","[CLASS:; INSTANCE:1]","left",1,$pos[0],$pos[1])
                For $i = 1 To 500
                    If GUIGetMsg() = $Button2 Then Exit
                    Sleep(10)
                Next
                WinSetTitle($Okno, '', 'Шаг1')
            WEnd
    EndSwitch
WEnd

Func On_Exit()
    Exit
EndFunc   ;==>On_Exit
Таким образом всё заработает, но кликает он несколько раз и закрывается окно(надо пока стоп не нажму, работал цикл) и при нажатии стоп закрывает полностью окно(надо только что бы остановился цикл)
И не выходит поставить у себя на каждый номер
 

---Zak---

Скриптер
Сообщения
455
Репутация
120
Код:
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

Opt("TrayOnEventMode", 1)
Opt("TrayMenuMode", 3)
Opt("PixelCoordMode", 2)

TrayCreateItem("Выход")
TrayItemSetOnEvent(-1, "On_Exit")

$left	= '3'				;Левая координата области для поиска
$top	= '51'				;Верхняя
$right	= '1116'			;Праввая
$bottom = '758'				;нижняя
$color	= '0xF3970C'		;Цвет пиксела
$hwnd	= ''

$Okno 	 = GUICreate("Окно", 315, 182, 192, 124)
$Button1 = GUICtrlCreateButton("Старт", 48, 80, 75, 25)
	GUICtrlSetState($Button1, $GUI_ENABLE)
$Button2 = GUICtrlCreateButton("Стоп", 168, 80, 75, 25)
	GUICtrlSetState($Button2, $GUI_DISABLE)
	GUISetState(@SW_SHOW)

$FLAG_RUN = False

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $Button1
			$FLAG_RUN = True
			GUICtrlSetState($Button1, $GUI_DISABLE)
			GUICtrlSetState($Button2, $GUI_ENABLE)
        Case $Button2
            $FLAG_RUN = False
			GUICtrlSetState($Button1, $GUI_ENABLE)
			GUICtrlSetState($Button2, $GUI_DISABLE)
	EndSwitch

	If $FLAG_RUN Then
		$pos = PixelSearch ( $left, $top, $right, $bottom, $color, $hwnd)
		If Not @error Then
			ControlClick("","","[CLASS:; INSTANCE:1]","left",1,$pos[0],$pos[1])
			WinSetTitle($Okno, '', 'Шаг1')
		EndIf
	EndIf

	Sleep(10)
WEnd

Func On_Exit()
    Exit
EndFunc   ;==>On_Exit
 
Автор
B

benxomi

Новичок
Сообщения
37
Репутация
0
---Zak--- сказал(а):
Код:
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

Opt("TrayOnEventMode", 1)
Opt("TrayMenuMode", 3)
Opt("PixelCoordMode", 2)

TrayCreateItem("Выход")
TrayItemSetOnEvent(-1, "On_Exit")

$left	= '3'				;Левая координата области для поиска
$top	= '51'				;Верхняя
$right	= '1116'			;Праввая
$bottom = '758'				;нижняя
$color	= '0xF3970C'		;Цвет пиксела
$hwnd	= ''

$Okno 	 = GUICreate("Окно", 315, 182, 192, 124)
$Button1 = GUICtrlCreateButton("Старт", 48, 80, 75, 25)
	GUICtrlSetState($Button1, $GUI_ENABLE)
$Button2 = GUICtrlCreateButton("Стоп", 168, 80, 75, 25)
	GUICtrlSetState($Button2, $GUI_DISABLE)
	GUISetState(@SW_SHOW)

$FLAG_RUN = False

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $Button1
			$FLAG_RUN = True
			GUICtrlSetState($Button1, $GUI_DISABLE)
			GUICtrlSetState($Button2, $GUI_ENABLE)
        Case $Button2
            $FLAG_RUN = False
			GUICtrlSetState($Button1, $GUI_ENABLE)
			GUICtrlSetState($Button2, $GUI_DISABLE)
	EndSwitch

	If $FLAG_RUN Then
		$pos = PixelSearch ( $left, $top, $right, $bottom, $color, $hwnd)
		If Not @error Then
			ControlClick("","","[CLASS:; INSTANCE:1]","left",1,$pos[0],$pos[1])
			WinSetTitle($Okno, '', 'Шаг1')
		EndIf
	EndIf

	Sleep(10)
WEnd

Func On_Exit()
    Exit
EndFunc   ;==>On_Exit
Благодарю, работает как надо, только при нажатии стоп он сначала доделывает цикл, можно ли что бы он сразу остановился?(просто это не весь цикл который надо ставить, там ещё + секунду 20 будет) и ждать 20 секунд после нажатия стоп не хотелось бы

Вставил к себе, только это не работает с этим Opt("GUIOnEventMode", 1) а без этого не работает мой интерфейс
 

---Zak---

Скриптер
Сообщения
455
Репутация
120
Многопоточности в AutoIt нет как таковой, т.е. код выполняется последовательно - а его можно уже прерывать на какой либо стадии

Есть некая "обманка"... посмотрите функции:
Код:
AdlibRegister
AdlibUnRegister


Вам нужно будет создать функцию, в которой выполняются операции. Чтобы прекратить какую-либо операции можно сделать "return" в функции.

По сути можно сделать так: по нажатию кнопки "Старт" срабатывает AdlibRegister, а так же какой-либо переменной (допустим $FLAG_RUN_AR) присваиваться значение - как это было с "$FLAG_RUN".
Далее в функции через строчку (*за исключением проверки @error) будет проверяться значение переменной (допустим $FLAG_RUN_AR) и если в ней есть какое-либо значение значит выход из функции.

Далее как выполняется выход из функции с учетом проверки переменной (допустим $FLAG_RUN_AR) выполняется функция "AdlibUnRegister"
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
benxomi [?]
Благодарю, работает как надо, только при нажатии стоп он сначала доделывает цикл, можно ли что бы он сразу остановился?(просто это не весь цикл который надо ставить, там ещё + секунду 20 будет) и ждать 20 секунд после нажатия стоп не хотелось бы
Пересмотрите алгоритм работы и, в частности, избавьте его от функций Sleep.

Если возникнут затруднения - можете привести полный цикл, мы его поправим.
 
Автор
B

benxomi

Новичок
Сообщения
37
Репутация
0
firex сказал(а):
benxomi [?]
Благодарю, работает как надо, только при нажатии стоп он сначала доделывает цикл, можно ли что бы он сразу остановился?(просто это не весь цикл который надо ставить, там ещё + секунду 20 будет) и ждать 20 секунд после нажатия стоп не хотелось бы
Пересмотрите алгоритм работы и, в частности, избавьте его от функций Sleep.

Если возникнут затруднения - можете привести полный цикл, мы его поправим.

Код:
While 1
$left='3';Левая координата области для поиска
$top='51';Верхняя
$right='1116';Праввая
$bottom='758';нижняя
$color='0xF3970C';Цвет пиксела
$hwnd=''
Opt("PixelCoordMode", 2)
$pos = PixelSearch ( $left, $top, $right, $bottom, $color, $hwnd)
If Not @error Then
    ControlClick("","","[CLASS::1]","left",1,$pos[0],$pos[1])
EndIf
Sleep(3000)
Send({NUMPAD2})
Sleep(500)
Send({UP})
Sleep(100)
Send({DOWN})
Sleep(100)
Send({LEFT})
Sleep(100)
Send({RIGHT})
Sleep(7000)
Send({NUMPAD1})
Sleep(7000)
WEnd

После нажатия 2, нужно время, действие сделается, после нажатия 1, нужно время пока объект дойдет до следующей цели. Но бывает когда это не нужно, то есть закончится всё на ControlClick. А ну и иногда в редких случаях, ControlClick не попадает по цели.


Добавлено:
Сообщение автоматически объединено:

---Zak--- сказал(а):
Многопоточности в AutoIt нет как таковой, т.е. код выполняется последовательно - а его можно уже прерывать на какой либо стадии

Есть некая "обманка"... посмотрите функции:
Код:
AdlibRegister
AdlibUnRegister


Вам нужно будет создать функцию, в которой выполняются операции. Чтобы прекратить какую-либо операции можно сделать "return" в функции.

По сути можно сделать так: по нажатию кнопки "Старт" срабатывает AdlibRegister, а так же какой-либо переменной (допустим $FLAG_RUN_AR) присваиваться значение - как это было с "$FLAG_RUN".
Далее в функции через строчку (*за исключением проверки @error) будет проверяться значение переменной (допустим $FLAG_RUN_AR) и если в ней есть какое-либо значение значит выход из функции.

Далее как выполняется выход из функции с учетом проверки переменной (допустим $FLAG_RUN_AR) выполняется функция "AdlibUnRegister"
Спасибо, буду пробовать
 

---Zak---

Скриптер
Сообщения
455
Репутация
120
Напишите две программы:

Программа #1:
Выводит GUI с двумя кнопками - Старт/Стоп
* Кнопка Старт - запуск "Программа #2" и запоминание PID - функция "Run"
* Кнопка Стоп - завершение процесса по PID - функция "ProcessClose". Рекомендую так же проверить через "ProcessExists"

Программа #2:
Запускает Ваш цикл поиска пикселей, нажатие кнопок, слипы и другое... все, что душе угодно.

Код:
Local $iPID = Run("notepad.exe")
Sleep(2000)
ProcessClose($iPID)

ProcessExists
 
Автор
B

benxomi

Новичок
Сообщения
37
Репутация
0
---Zak--- сказал(а):
Напишите две программы:

Программа #1:
Выводит GUI с двумя кнопками - Старт/Стоп
* Кнопка Старт - запуск "Программа #2" и запоминание PID - функция "Run"
* Кнопка Стоп - завершение процесса по PID - функция "ProcessClose". Рекомендую так же проверить через "ProcessExists"

Программа #2:
Запускает Ваш цикл поиска пикселей, нажатие кнопок, слипы и другое... все, что душе угодно.

Код:
Local $iPID = Run("notepad.exe")
Sleep(2000)
ProcessClose($iPID)

ProcessExists
Да мне хотелось что бы всё в одном было, запуска программу, открывается окно, выбираешь нужное меню, в моем случае меню2/номер 2, и там Страт/Стоп. Но я пока не разобрался как запустить и остановить) ну знаю, только без
Opt("GUIOnEventMode", 1), а надо с этим
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
---Zak---
Тут возможен более красивый подход.

benxomi
Исходя из приведенных вами данных:

Код:
Opt("PixelCoordMode", 2)
Global $iLeft = 3, _ ;Левая координата области для поиска
	$iTop = 51, _;Верхняя
	$iRight = 1116, _ ;Праввая
	$iBottom = 758, _ ;нижняя
	$vColor = 0xF3970C, _ ;Цвет пиксела
	$aPos, $IsStarted, $Idx, _
	$aSendKeys[7][2] = [ [ 6 ], _ ;Ваши клавиши
		[ 3000, '{NUMPAD2}' ], _
		[ 500, '{UP}' ], _
		[ 100, '{DOWN}' ], _
		[ 100, '{LEFT}' ], _
		[ 100, '{RIGHT}' ], _
		[ 7000, '{NUMPAD1}' ] ]

HotKeySet( "{F5}", "_Toggle" )

While Sleep( 10 )
	While $IsStarted
		$aPos = PixelSearch ( $iLeft, $iTop, $iRight, $iBottom, $vColor )
		If Not @Error Then _
			ControlClick( "", "", "[CLASS::1]", "left", 1, $aPos[0], $aPos[1] )

		For $Idx = 1 To $aSendKeys[0][0] Step 1
			If Not _Sleep( $aSendKeys[$Idx][0] ) Then _
				ExitLoop 2

			Send( $aSendKeys[$Idx][1] )
		Next
		_Sleep( 7000 )
	WEnd
WEnd

Func _Sleep( $iMs )
	Local $iTime = TimerInit()
	; ---
	While TimerDiff( $iTime ) < $iMs And $IsStarted
		Sleep( 10 )
	WEnd
	; ---
	Return $IsStarted
EndFunc

Func _Toggle()
	$IsStarted = Not $IsStarted
EndFunc


Сами допишете GUI, управление циклом происходит посредством $IsStarted
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
benxomi,
Предупреждение За нарушение общих правил (пункт В.2):
Старайтесь избегать “Over quoting” (преувеличенное цитирование) - цитируйте только необходимую часть сообщения, которая наилучшим образом подчеркнёт суть цитируемого.


С уважением, ваш Глобальный модератор.
 

---Zak---

Скриптер
Сообщения
455
Репутация
120
Opt("GUIOnEventMode", 1), а надо с этим

Код:
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

Opt("TrayOnEventMode", 1)
Opt("TrayMenuMode", 3)
Opt("PixelCoordMode", 2)

Opt("GUIOnEventMode", 1)

TrayCreateItem("Выход")
TrayItemSetOnEvent(-1, "On_Exit")


$left   = '3'               ;Левая координата области для поиска
$top    = '51'              ;Верхняя
$right  = '1116'            ;Праввая
$bottom = '758'             ;нижняя
$color  = '0xF3970C'        ;Цвет пиксела
$hwnd   = ''

$Okno    = GUICreate("Окно", 315, 182, 192, 124)
	GUISetOnEvent($GUI_EVENT_CLOSE, "On_Exit")
$Button1 = GUICtrlCreateButton("Старт", 48, 80, 75, 25)
    GUICtrlSetState($Button1, $GUI_ENABLE)
$Button2 = GUICtrlCreateButton("Стоп", 168, 80, 75, 25)
    GUICtrlSetState($Button2, $GUI_DISABLE)

	GUICtrlSetOnEvent($Button1, "OKButton")
	GUICtrlSetOnEvent($Button2, "OKButton2")


GUISetState(@SW_SHOW, $Okno)

$FLAG_RUN = False

While 1
    If $FLAG_RUN Then
        $pos = PixelSearch ( $left, $top, $right, $bottom, $color, $hwnd)
        If Not @error Then
            ControlClick("","","[CLASS:; INSTANCE:1]","left",1,$pos[0],$pos[1])
            WinSetTitle($Okno, '', 'Шаг1')
        EndIf
    EndIf
    Sleep(100) ; Sleep to reduce CPU usage
WEnd



Func OKButton()
	$FLAG_RUN = True
    GUICtrlSetState($Button1, $GUI_DISABLE)
	GUICtrlSetState($Button2, $GUI_ENABLE)
EndFunc   ;==>On_Button1

Func OKButton2()
	$FLAG_RUN = False
	GUICtrlSetState($Button1, $GUI_ENABLE)
	GUICtrlSetState($Button2, $GUI_DISABLE)
EndFunc   ;==>On_Button2

Func On_Exit()
    Exit
EndFunc   ;==>On_Exit


Добавлено:
Сообщение автоматически объединено:

firex

Подход интересный, но... я прикрутил ГУИ без Opt("GUIOnEventMode", 1)

Получилось как-то так и не получается у меня нажать кнопку "Стоп":
Код:
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

Opt("TrayOnEventMode", 1)
Opt("TrayMenuMode", 3)
Opt("PixelCoordMode", 2)

TrayCreateItem("Выход")
TrayItemSetOnEvent(-1, "On_Exit")

Global $iLeft = 3, _ ;Левая координата области для поиска
    $iTop = 51, _;Верхняя
    $iRight = 1116, _ ;Праввая
    $iBottom = 758, _ ;нижняя
    $vColor = 0xF3970C, _ ;Цвет пиксела
    $aPos, $IsStarted, $Idx, _
    $aSendKeys[7][2] = [ [ 6 ], _ ;Ваши клавиши
        [ 3000, '{NUMPAD2}' ], _
        [ 500, '{UP}' ], _
        [ 100, '{DOWN}' ], _
        [ 100, '{LEFT}' ], _
        [ 100, '{RIGHT}' ], _
        [ 7000, '{NUMPAD1}' ] ]

HotKeySet( "{F5}", "_Toggle" )

$Okno    = GUICreate("Окно", 315, 182, 192, 124)
$Button1 = GUICtrlCreateButton("Старт", 48, 80, 75, 25)
    GUICtrlSetState($Button1, $GUI_ENABLE)
$Button2 = GUICtrlCreateButton("Стоп", 168, 80, 75, 25)
    GUICtrlSetState($Button2, $GUI_DISABLE)
    GUISetState(@SW_SHOW)


While Sleep( 10 )
	$nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $Button1
            _Toggle()
            GUICtrlSetState($Button1, $GUI_DISABLE)
            GUICtrlSetState($Button2, $GUI_ENABLE)
        Case $Button2
            _Toggle()
			MsgBox(0, '', '1')
            GUICtrlSetState($Button1, $GUI_ENABLE)
            GUICtrlSetState($Button2, $GUI_DISABLE)
	EndSwitch


    While $IsStarted
		ConsoleWrite('1')
        _Sleep( 7000 )
    WEnd
WEnd

Func _Sleep( $iMs )
    Local $iTime = TimerInit()
    ; ---
    While TimerDiff( $iTime ) < $iMs And $IsStarted
        Sleep( 10 )
    WEnd
    ; ---
    Return $IsStarted
EndFunc

Func _Toggle()
    $IsStarted = Not $IsStarted
EndFunc

Func On_Exit()
    Exit
EndFunc   ;==>On_Exit

Как я понимаю цикл начинает работать уже этот:
Код:
While TimerDiff( $iTime ) < $iMs And $IsStarted
        Sleep( 10 )
    WEnd


И на нажатие кнопок уже не реагирует, т.к. по кнопке "Стоп" должно быть сообщение.



Но если использовать с Opt("GUIOnEventMode", 1), то нажатие на кнопки уже существует...

Код:
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

Opt("TrayOnEventMode", 1)
Opt("TrayMenuMode", 3)
Opt("PixelCoordMode", 2)

Opt("GUIOnEventMode", 1)

TrayCreateItem("Выход")
TrayItemSetOnEvent(-1, "On_Exit")

Global $iLeft = 3, _ ;Левая координата области для поиска
    $iTop = 51, _;Верхняя
    $iRight = 1116, _ ;Праввая
    $iBottom = 758, _ ;нижняя
    $vColor = 0xF3970C, _ ;Цвет пиксела
    $aPos, $IsStarted, $Idx, _
    $aSendKeys[7][2] = [ [ 6 ], _ ;Ваши клавиши
        [ 3000, '{NUMPAD2}' ], _
        [ 500, '{UP}' ], _
        [ 100, '{DOWN}' ], _
        [ 100, '{LEFT}' ], _
        [ 100, '{RIGHT}' ], _
        [ 7000, '{NUMPAD1}' ] ]

HotKeySet( "{F5}", "_Toggle" )

$Okno    = GUICreate("Окно", 315, 182, 192, 124)
    GUISetOnEvent($GUI_EVENT_CLOSE, "On_Exit")
$Button1 = GUICtrlCreateButton("Старт", 48, 80, 75, 25)
    GUICtrlSetState($Button1, $GUI_ENABLE)
$Button2 = GUICtrlCreateButton("Стоп", 168, 80, 75, 25)
    GUICtrlSetState($Button2, $GUI_DISABLE)

    GUICtrlSetOnEvent($Button1, "OKButton")
    GUICtrlSetOnEvent($Button2, "OKButton2")


GUISetState(@SW_SHOW, $Okno)


While Sleep( 10 )
    While $IsStarted
        $aPos = PixelSearch ( $iLeft, $iTop, $iRight, $iBottom, $vColor )
        If Not @Error Then _
            ControlClick( "", "", "[CLASS::1]", "left", 1, $aPos[0], $aPos[1] )

        For $Idx = 1 To $aSendKeys[0][0] Step 1
            If Not _Sleep( $aSendKeys[$Idx][0] ) Then _
                ExitLoop 2

            Send( $aSendKeys[$Idx][1] )
        Next
        _Sleep( 1000 )
    WEnd
WEnd

Func _Sleep( $iMs )
    Local $iTime = TimerInit()
    ; ---
    While TimerDiff( $iTime ) < $iMs And $IsStarted
        Sleep( 10 )
    WEnd
    ; ---
    Return $IsStarted
EndFunc

Func _Toggle()
    $IsStarted = Not $IsStarted
EndFunc

Func OKButton()
    _Toggle()
    GUICtrlSetState($Button1, $GUI_DISABLE)
    GUICtrlSetState($Button2, $GUI_ENABLE)
EndFunc   ;==>On_Button1

Func OKButton2()
    _Toggle()
    GUICtrlSetState($Button1, $GUI_ENABLE)
    GUICtrlSetState($Button2, $GUI_DISABLE)
EndFunc   ;==>On_Button2

Func On_Exit()
    Exit
EndFunc   ;==>On_Exit

benxomi
Попробуй последний вариант под спойлером - там уже прикрутил метод firex к ГУИ через Opt("GUIOnEventMode", 1) и будем всем форумом ждать от тебя новостей - работает или нет.
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
---Zak---
Так и не должно работать, управление ведь в цикле:
4451aeecc6.png


Я исходил из Opt("GUIOnEventMode", 1), только с ним будет корректно работать в этом алгоритме.
 

---Zak---

Скриптер
Сообщения
455
Репутация
120
firex
С Opt("GUIOnEventMode", 1) работает - я подправил свое предыдущее сообщение и прикрутил туда ГУИ.

А есть какой-нибудь вариант без Opt("GUIOnEventMode", 1) ? Мне уже для себя - для самообразования так сказать.


Сам спросил - сам ответил:
Код:
Func _Sleep( $iMs )
    Local $iTime = TimerInit()
    ; ---
    While TimerDiff( $iTime ) < $iMs And $IsStarted
		$nMsg = GUIGetMsg()
		Switch $nMsg
			Case $GUI_EVENT_CLOSE
				Exit
			Case $Button1
				_Toggle()
				GUICtrlSetState($Button1, $GUI_DISABLE)
				GUICtrlSetState($Button2, $GUI_ENABLE)
			Case $Button2
				_Toggle()
				MsgBox(0, '', '1')
				GUICtrlSetState($Button1, $GUI_ENABLE)
				GUICtrlSetState($Button2, $GUI_DISABLE)
		EndSwitch
        Sleep( 10 )
    WEnd
    ; ---
    Return $IsStarted
EndFunc


Управление все же здесь:
Код:
While TimerDiff( $iTime ) < $iMs And $IsStarted
        Sleep( 10 )
    WEnd


Мы будем Sleep( 10 ) до тех пор пока не "истечет время" и не изменится $IsStarted... Чтобы изменить $IsStarted нужно в этом цикле вызвать нажатие кнопки
 
Автор
B

benxomi

Новичок
Сообщения
37
Репутация
0
Нет, не работает, даже не начинает работать при нажатии старт.
Цифры с управлением стрелками работает, а вот поиск пикселя и нажатия туда - нет
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
Автор
B

benxomi

Новичок
Сообщения
37
Репутация
0
Да я ещё вчера сделал, не успел только написать, так что спасибо за помощь
 
Верх