Что нового

Проблема с отправкой символов в цикле

max.komar.mtw

Новичок
Сообщения
6
Репутация
0
Вот есть такой небольшой скрипт:
Код:
#include <Misc.au3>
hotkeyset("g", "LoopG")
while 1
	Sleep(5)
wend	

Func LoopG()
	hotkeyset("g")
	while _IsPressed("47") ;g
		Send("c")
		Send("w")
	WEnd
	hotkeyset("g", "LoopG")
EndFunc


Я его запускаю и ожидаю при зажатии клавиши g получить строку такого вида (в notepad):
cwcwcwcw ...
Однако, вот что получается:
cwcwcwcwcwcwcwcwcwcwcwcwcwcwcwcwcwcwcwcwcwcgwcwgcwcgwcwgcwcgwcwgcwcgwcwgcwcgwcgwcwgcwcgwcwgcwgcwcgwcwgcwc
Почему появляется буква g, ведь я переопределил ее поведение с помощью hotkeyset и как исправить?

Благодарю за внимание.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Предупреждение За нарушение правил форума (пункт В.11):
Любые отрывки AutoIt кода необходимо заключать в тег [autoit]
autoit.gif
(подробнее), а обычный код соответственно в тег [code]
code.gif
(подробнее). Также большие выдержки текста помещайте под тег [spoiler]
spoiler.gif
(подробнее), там где это поддерживается естественно. Как в случае с названием темы, также короткое и эргономичное сообщение привлекает больше внимания, и шансы на получение конкретного ответа увеличиваются.


С уважением, ваш Модератор.
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Почему бы вам просто не сделать проще:
Код:
hotkeyset("g", "LoopG")

while 1
    Sleep(5)
wend

Func LoopG()
  Send("cw")
EndFunc

Работает так как вам нужно. Только есть одно НО. В функции LoopG нельзя посылать g иначе зациклится.
 

running-frag

why me?
Сообщения
441
Репутация
60
Код:
hotkeyset("g")

Что вы хотели этой строкой добится?


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

потестите на этой переделке и увидете свою ошибку
Код:
HotKeySet ("g", "LoopG")

While True
	Sleep (5)
Wend   

Func LoopG()
    ConsoleWrite ("LoopG is started..."&@CR)
	
	While _IsPressed ("47")
		ConsoleWrite ("_isPressed : ")
		ConsoleWrite ("sended C; ")
		ConsoleWrite ("sended W;"&@CR)
		Sleep (100)
	WEnd
	
	ConsoleWrite ("LoopG is ended..."&@CR)
EndFunc


upd: добавлен sleep в цикл
 
Автор
M

max.komar.mtw

Новичок
Сообщения
6
Репутация
0
hotkeyset("g") - убирает привязку кнопки g к функции LoopG.
Нужно это именно для того, чтобы кнопку g внутри функции LoopG же и использовать. Так что такое решение не подходит.
 

running-frag

why me?
Сообщения
441
Репутация
60
Код:
#include <Misc.au3>
HotKeySet ("g", "LoopG")

While True
	Sleep (5)
Wend   

Func LoopG()
    ConsoleWrite ("LoopG is started..."&@CR)
	HotKeySet ("g")
	
	While True
		If _IsPressed ("47") Then
			ConsoleWrite ("_isPressed : ")
			ConsoleWrite ("sended C; ")
			ConsoleWrite ("sended W;"&@CR)
			Sleep (100)
		Else
			ExitLoop
		EndIf
	WEnd
		
	HotKeySet ("g", "LoopG")
	ConsoleWrite ("LoopG is ended..."&@CR)
EndFunc


Вот тут хорошо видно где выскакивает "G". Прикол (насколько я понял) в том что когда мы снимаем хотки с кнопки она уже понимается как буква при том что цикл "CW" уже запущен.


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

вот готовое вроде без косяков
Код:
#include <Misc.au3>
HotKeySet ("g", "LoopG")

Global $_check = False		; флаг

While True
	Sleep (5)
Wend

Func LoopG()
	If $_check Then Return 	; значит уже запущенно
	$_check = True			; меняем флаг
	
    ConsoleWrite ("LoopG is started..."&@CR)
	
	While True
		If _IsPressed ("47") Then
			ConsoleWrite ("_isPressed : ")
			ConsoleWrite ("sended C; ")
			ConsoleWrite ("sended W;"&@CR)
			Sleep (100)
		Else
			ExitLoop
		EndIf
	WEnd
	
	$_check = False			; меняем флаг
	ConsoleWrite ("LoopG is ended..."&@CR)
EndFunc
 
Автор
M

max.komar.mtw

Новичок
Сообщения
6
Репутация
0
Вариант с использованием флага работает, однако, как быть, если мы заменим тело цикла на:
Код:
Send("g")
Send("w")


Тогда
Код:
Send("g")
обрабатываться не будет
 

running-frag

why me?
Сообщения
441
Репутация
60
странный ты, то лишняя "G" то наоборот не показывает её :rofl:

как быть? легко, убрать с кнопки "G" хотки
кури в сторону задержки клавиш
ну или грубейший вариант, но всё равно мы "теряем" кнопку G для обычного ввода

Код:
#include <Misc.au3>
HotKeySet ("g", "LoopG")

Global $_check = False		; флаг

While True
	Sleep (5)
Wend

Func LoopG()
	If $_check Then Return 	; значит уже запущенно
	$_check = True			; меняем флаг
	
    ConsoleWrite ("LoopG is started..."&@CR)
	
	While True
		If _IsPressed ("47") Then
			ConsoleWrite ("_isPressed : ")
			
			HotKeySet ("g")					; стрёмный вариант
			ConsoleWrite ("sended G; ")
			HotKeySet ("g", "LoopG")
			
			ConsoleWrite ("sended W;"&@CR)
			Sleep (100)
		Else
			ExitLoop
		EndIf
	WEnd
	
	$_check = False			; меняем флаг
	ConsoleWrite ("LoopG is ended..."&@CR)
EndFunc



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

в идеале нужно проверять в LoopG задержку клавиши, если она больше чем N мили\секунд - выполнять те действия что нужны по функции, если зажим клавиши был "маленьким" тогда "писать" букву (в нашем случае) "G"

таким образом мы и писать можем и выполнять функцию по одной клавише

ps: как делать проверки зажатий клавиш не знаю, поэтому подсказать не могу


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

OffTopic:
не люблю людей которые неумеют говорить спасибо :mad:
 
Автор
M

max.komar.mtw

Новичок
Сообщения
6
Репутация
0
Спасибо ;) я на самом деле копаюсь еще в коде, придумывая решение )
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
max.komar.mtw,
Предупреждение За нарушение правил форума (пункт В.11):
Любые отрывки AutoIt кода необходимо заключать в тег [autoit]
autoit.gif
(подробнее), а обычный код соответственно в тег [code]
code.gif
(подробнее). Также большие выдержки текста помещайте под тег [spoiler]
spoiler.gif
(подробнее), там где это поддерживается естественно. Как в случае с названием темы, также короткое и эргономичное сообщение привлекает больше внимания, и шансы на получение конкретного ответа увеличиваются.


С уважением, ваш Модератор.
 
Автор
M

max.komar.mtw

Новичок
Сообщения
6
Репутация
0
Эм, а в каком месте я нарушил?) Если речь идет про две строчки Send, то это и не код, а так идея.
 
Верх