Что нового

[Мышь, клавиатура] непрерывный цикл с множественным условием внутри

D0R0T0N

Новичок
Сообщения
7
Репутация
0
здравствуйте. имею базовые знания в языках но с AutoIt сталкиваюсь впервые.

подскажите работает здесь условие типа Case ... Of ?

необходимо создать повторяющийся цикл, (например на нажатие клавиш 1,2,3,4,5 по очереди), с триггером учитывающим шаг цикла и соответственно меняющим на определенных шагах интервал нажатия.

вообщем получилось что-то типа этого

Код:
Global	$f_is_enabled = False
	$i_interval = 0
	$i_step = 0
	$i_keypress = 1 

HotKeySet("{f11}", "_enable")
HotKeySet("{f12}", "_disable") 

While 1
	if $f_is_enabled = True Then         
		send("$i_keypress down")
		sleep(100)
		send("$i_keypress up")
			$i_step = $i_step + 1
			$i_keypress = $i_keypress + 1
		if ($i_keypress div 6 = 1) then 
			$i_keypress = 1
		EndIf
		case ($i_step) of
			 0: $i_interval = 1200
		 	 1: $i_interval = 800
		 	 6: $i_interval = 1000
			12: $i_interval = 1200
		EndCase
		sleep($i_interval)
	EndIf
WEnd

Func _enable()
	$is_enabled = true
EndFunc

Func _disable()
	$is_enabled = false
EndFunc

написал - проверил - не работает

как привести его в рабочий вид?
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Case только в составе
Код:
Select или Switch
понажимайте эти ссылки,попадете в справку, там есть примеры
 
Автор
D

D0R0T0N

Новичок
Сообщения
7
Репутация
0
изменил как по учебнику скрипт
теперь он вида
Код:
Global	$f_is_enabled = False
	$i_interval = 0
	$i_step = 0
	$i_keypress = 1 

HotKeySet("{f11}", "_enable")
HotKeySet("{f12}", "_disable") 

While 1
	if $f_is_enabled = True Then         
		send("{$i_keypress}")
			$i_step = $i_step + 1
			$i_keypress = $i_keypress + 1
		if ($i_keypress div 6 = 1) then 
			$i_keypress = 1
		EndIf
		Select
			Case $i_step = 0
				$i_interval = 1200
			Case $i_step = 1
		 		$i_interval = 800
			Case $i_step = 6
		 		$i_interval = 1000
			Case $i_step = 12
				$i_interval = 1200
		EndSelect
		sleep($i_interval)
	EndIf
WEnd

Func _enable()
	$is_enabled = true
EndFunc

Func _disable()
	$is_enabled = false
EndFunc

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

если убрать основную часть кода и поставить вместо нее просто несколько нажатий - прекрасно срабатывает

что еще нужно править?
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
я думаю вам нужно писать код в редакторе SciTe а не в блокноте, и проверять на синтаксис сперва.
 
Автор
D

D0R0T0N

Новичок
Сообщения
7
Репутация
0
так в нем и пишу - при запуске ошибок не выдает. но не работает все равно. синтаксис в порядке вроде. может где не заметил - ткните носом.
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
D0R0T0N
Код заключите в теги, третья кнопка в нижнем ряду. Что такое "$i_keypress div 6"? Может div это /
Если вы видите что цвет не соответствует зарегистрированным элементам то значит вы пишите неправильно.
Код:
Send($i_keypress)

Код:
If (Int($i_keypress / 6) = 1) Then
 
Автор
D

D0R0T0N

Новичок
Сообщения
7
Репутация
0
поправил. все равно не робит. попытался написать аналогичную вещь но уже через массив и с ограниченным числом повторений - тоже самое запускается и только грузит проц а результата ноль.

Код:
HotKeySet("{f11}", "_enable")
HotKeySet("{f12}", "_disable")

Global $f_is_enabled = False
Global $x
Global $y
Global $i_interval = 0
Global $i_step = 0
Global $a[1] = ["1"]
Global $a[2] = ["2"]
Global $a[3] = ["3"]
Global $a[4] = ["4"]
Global $a[5] = ["5"]	  

While 1
   if $f_is_enabled = True Then
	  _Action()
   EndIf
WEnd

Func _Action()
   for $y = 1 to 3
	  for $x = 1 to 5
		 Select 
			Case $i_step = 0
			$i_interval = 1000
			Case $i_step = 1 to 5
			$i_interval = 800
			Case $i_step = 6 to 11
			$i_interval = 600
			Case $i_step = 12 to 15
			$i_interval = 400
		 EndSelect  
		 sleep($i_interval)
		 $i_step = $i_step + 1	
		 send($a[$x])
	  Next
   next
EndFunc

Func _enable()
   $is_enabled = true
EndFunc

Func _disable()
   $is_enabled = false
EndFunc

до меня только дошло - может send и sleep не работают с переменными?
просто когда указываю код кнопки или текст, без циклов и вычислений, он прекрасно его пишет
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
D0R0T0N
В SсiTe есть комбинация CTRL+F5 (проверка синтаксиса) нажмите. Дальше внизу откроется консоль, где буду все ошибки. А если у вас последняя версия, то они же подсвется в тексте программы.
 
Автор
D

D0R0T0N

Новичок
Сообщения
7
Репутация
0
консоль была открыта с самого начала. при нажатии ctrl+f5 в консоли ничего не пишет.
при запуске скрипта пишет что ошибок не обнаружено и запускает. но результат при этом нулевой - только проц грузится и греется

такое ощущение что происходит зацикливание, только не понятно где
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
D0R0T0N

Подкорректировал. В Select нет оператора To, он есть только в Switch.

Код:
HotKeySet("^{f11}", "_enable")
HotKeySet("^{f12}", "_disable")
HotKeySet("{Esc}", "_Exit")

Global $f_is_enabled = False
Global $i_interval = 0
Global $i_step = 0
; Global $a[5] = [1, 2, 3, 4, 5]

While 1
	If $f_is_enabled Then _Action()
	Sleep(10)
WEnd

Func _Action()
	For $y = 1 To 3
		For $x = 1 To 5
			Switch $i_step
				Case 0
					$i_interval = 1000
				Case 1 To 5
					$i_interval = 800
				Case 6 To 11
					$i_interval = 600
				Case 12 To 15
					$i_interval = 400
			EndSwitch
			ToolTip($i_step) ; вывод что работает
			Sleep($i_interval)
			$i_step += 1
			; Send($a[$x])
			; Send($x)
		Next
	Next
EndFunc   ;==>_Action

Func _enable()
	$f_is_enabled = True
	ToolTip('True') ; вывод что работает
EndFunc   ;==>_enable

Func _disable()
	$f_is_enabled = False
	ToolTip('False') ; вывод что работает
EndFunc   ;==>_disable

Func _Exit()
	Exit
EndFunc   ;==>_Exit


но результат при этом нулевой
имена триггеров то надо было назвать одинаково.
 
Автор
D

D0R0T0N

Новичок
Сообщения
7
Репутация
0
большое спасибо - то-что-доктор-прописал ;D
единственное но -> во время исполнения цикла его прерывание не сразу срабатывает - приходится несколько раз долбить кнопку
изза чего потом в памяти остается зажатая ctrl даже если закрыть скрипт. решается нажатием пару раз ctrl+tab.
 

Naisho

Знающий
Сообщения
86
Репутация
12
D0R0T0N
попробуйте добавить в конец функций "_enable" и "_disable" :
Код:
ControlSend("", "", "", "text", 0)

Возможно ситуация с залипаниями облегчится
 
Автор
D

D0R0T0N

Новичок
Сообщения
7
Репутация
0
только левый перестал залипать

прерывание не срабатывает сразу. 100500+ кнопок нажимает прежде чем прерывается цикл

лучший выход на мой взгляд это полное отключение реализованое через esc
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
D0R0T0N
лучший выход на мой взгляд это полное отключение реализованое через esc
При переключении триггера не гарантируется остановка функции, так как в ней 15 шагов цикла да ещё с ожиданием 1 сек, в итоге функция остановится через 15 сек после вызова? так что лучший выход остановить функцию - добавить проверку триггера внутри функции в каждом шаге цикла.

Залипание: http://autoit-script.ru/index.php/topic,9619.0.html поиск рулит.
 
Верх