1 (изменено: Ox1de, 2016-04-05 11:17:37)

Тема: AHK: Как сделать цикл который обрывается сразу после отжатия клавиши?

Здравствуйте, собственно вопрос в шапке, нужно сделать цикл, к примеру пока держу клавишу 1, печатаются клавиши 23456,  но,  как только я ее отпускаю цикл должен сразу прерываться, поясню, к примеру я нажал клавишу и тут же отпустил, цикл будет идти до конца и закончится, а нужно чтобы он обрывался сразу когда клавиша отжата не доходив до конца. Как это реализовать?

2

Re: AHK: Как сделать цикл который обрывается сразу после отжатия клавиши?

Ox1de, после знаков препинания нужен отступ (пробел).
В названии темы должен быть префикс скриптового языка.

3

Re: AHK: Как сделать цикл который обрывается сразу после отжатия клавиши?

Я делаю так:

1::
While GetKeyState("1","P") {
Send 2
If !(GetKeyState("1","P"))
Break
Send 3
If !(GetKeyState("1","P"))
Break
Send 4
If !(GetKeyState("1","P"))
Break
Send 5
If !(GetKeyState("1","P"))
Break
Send 6
If !(GetKeyState("1","P"))
Break
}
Return

Если кто то покажет как делать правильно, буду признателен.

4

Re: AHK: Как сделать цикл который обрывается сразу после отжатия клавиши?

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


sc4f::
   Loop
   {
      Send, {10
      Send, {sc41}
      Sleep, 10
      Send, {sc44}
      Sleep, 10
      Send, {sc43}
      Sleep, 10
      Send, {sc42}
      Sleep, 10
      Send, {sc41}
      Sleep, 10


      If !GetKeyState("sc4f", "P")
         Break
   }
   Return

5 (изменено: Ox1de, 2016-04-05 16:54:36)

Re: AHK: Как сделать цикл который обрывается сразу после отжатия клавиши?

Nikva Шикарно, вот то что нужно казалось бы, но почему таким способом  ф1-ф12 не хотят нажиматься?


P.s  Разобрался, спасибо тебе большое!

6 (изменено: Nikva, 2016-04-05 16:50:16)

Re: AHK: Как сделать цикл который обрывается сразу после отжатия клавиши?

У меня нажимает, попробуйте SetKeyDelay.

SetKeyDelay, 100, 50
sc4f:: ; NumpadEnd
   Loop
   {
      Send, {10
      Send, {sc41} ; F7
      Sleep, 10
      If !GetKeyState("sc4f", "P")
         Break
      Send, {sc44} ; F10
      Sleep, 10
      If !GetKeyState("sc4f", "P")
         Break
      Send, {sc43} ; F9
      Sleep, 10
      If !GetKeyState("sc4f", "P")
         Break
      Send, {sc42} ; F8
      Sleep, 10
      If !GetKeyState("sc4f", "P")
         Break
      Send, {sc41} ; F7
      Sleep, 10
      If !GetKeyState("sc4f", "P")
         Break
   }
   Return

7

Re: AHK: Как сделать цикл который обрывается сразу после отжатия клавиши?

Поэксперементировал с Reload, чтобы при отпускании клавиши (проверка через таймер) скрипт перезагружался - не получилось, даже с  #SingleInstance force  создаются дубликаты скрипта (десятки и сотни). Если скомпилировать скрипт и использовать ExitApp, то можно сделать в паре с другим отдельным скриптом, который будет запускать скомпилированный скрипт (рабочий) при его отсутствии (в процессах).

А так, видимо, пириведенный выше вариант самый "дубовый".

Можно сделать немного лаконичней код с помощью функции:

ExitIfKeyIsUp(key) {
	If !(GetKeyState(key,"P"))
		Exit	
}

sc4f::
   Loop
   {
      Send, {10
	  ExitIfKeyIsUp("sc4f")
      Send, {sc41}
	  ExitIfKeyIsUp("sc4f")
      Sleep, 10
	  ExitIfKeyIsUp("sc4f")
      Send, {sc44}
      Sleep, 10
	  ExitIfKeyIsUp("sc4f")
      Send, {sc43}
      Sleep, 10
	  ExitIfKeyIsUp("sc4f")
      Send, {sc42}
      Sleep, 10
	  ExitIfKeyIsUp("sc4f")
      Send, {sc41}
      Sleep, 10
	  ExitIfKeyIsUp("sc4f")
   }
   Return

8

Re: AHK: Как сделать цикл который обрывается сразу после отжатия клавиши?

mafckz пишет:

с  #SingleInstance force  создаются дубликаты скрипта (десятки и сотни)

Я лечу такие скрипты добавлением в начало это кода:

DetectHiddenWindows, on
IfWinExist, % A_ScriptName
ExitApp

В ahk скриптах всегда есть скрытое окно, и если уже существует окно с именем скрипта, он тут же завершится.

9

Re: AHK: Как сделать цикл который обрывается сразу после отжатия клавиши?

То что нужно получилось! Спасибо ребята! Nikva отдельное спасибо! А подскажите еще вот такой момент : нужно к примеру на клавишу 1 сделать цикл клавиши 2 и что бы он включался клавишей 1 и воспроизводился до бесконечности и этой же клавишей 1 выключался. 

P.s. Заранее извиняюсь если много вопросов.

10 (изменено: mafckz, 2016-04-05 18:19:05)

Re: AHK: Как сделать цикл который обрывается сразу после отжатия клавиши?

Все-таки, удалось написать с ExitApp. Ограничение такого метода в том, что между нажатиями клавиши нужен промежуток времени в 300-500 милисекунд (пока скрипт новый запустится)

#SingleInstance off
#NoEnv
#UseHook On
SetBatchLines, -1
SetKeyDelay -1

Interval := 10

1::
	SetTimer timer, 0
	While GetKeyState("1","P") {
		Send 1
		Sleep %Interval%
		Send 2
		Sleep %Interval%
		Send 3
		Sleep %Interval%
		Send 4
		Sleep %Interval%
		Send 5
		Sleep %Interval%
		Send 6
	}
	return

timer:
	if !GetKeyState("1","P")
	{
		Run %A_ScriptFullPath%
		ExitApp
	}

11

Re: AHK: Как сделать цикл который обрывается сразу после отжатия клавиши?

Ox1de

1::
KeyWait, 1
while !GetKeyState("1", "P") {
Send 2
Sleep 100
}
Return

12

Re: AHK: Как сделать цикл который обрывается сразу после отжатия клавиши?

rcontrol::
KeyWait, rcontrol
while !GetKeyState("rcontrol", "P") {
Send 7
Sleep 400
}
Return 

Вроде все так и сделал,но цикл то идет,а останавливается как-то рандомно,то со 2 то с 3 нажатия,где я мог ошибиться?

13

Re: AHK: Как сделать цикл который обрывается сразу после отжатия клавиши?

Вероятнее всего нажатие происходить в момент когда скрипт ждет Sleep 400, вылечить можно добавив переменную:

rcontrol::
WhileSend7:=1
KeyWait, rcontrol
while (!GetKeyState("rcontrol", "P") And WhileSend7 = 1) {
Send 7
Sleep 400
}
Return
#If WhileSend7
rcontrol::WhileSend7:=0

14

Re: AHK: Как сделать цикл который обрывается сразу после отжатия клавиши?

Спасибо!Теперь отлично.