1 (изменено: Krotus, 2011-11-03 20:04:31)

Тема: AHK: Как обойти KeyWait и завершить Loop

Постигаю основы AHK недавно и данная проблемма поставила меня кажется надолго в тупик. Необходимо в данном скрипте остановить Loop в исполняемом блоке при переходе на другой блок. Понимаю что возможно через IF но не пойму куда её ставить.Похожих блоков планируетя много. Если не трудно дайте  ответ с примерами скриптов

WheelDown::
Loop
{
KeyWait, LButton, D
MouseClick, Left
send, +{1}
MouseClick, Left
send, +{2}
}
Return

WheelUp::
Loop
{
KeyWait, LButton, D
MouseClick, Left
send, ^{1}
MouseClick, Left
Send, send, ^{2}
}
Return

2 (изменено: Alectric, 2011-11-03 21:25:26)

Re: AHK: Как обойти KeyWait и завершить Loop

При каком условии должно прекратится зацикливание? При нажатии или отпускании какой либо кнопки?

Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

3

Re: AHK: Как обойти KeyWait и завершить Loop

В целом скрипте в остальных блоках начинающихся например с 1:: пытаюсь добиться прекращения цикла Loop в исполняемом на данный момент и переходе к действиям начинающихся по нажатию кнопки 1 или как в моем примере поворота колеса мыши WheelDown::

4 (изменено: Alectric, 2011-11-03 21:27:36)

Re: AHK: Как обойти KeyWait и завершить Loop

Попробуй так:

WheelDown::
WheelUp::
esc::
Loop
{
  KeyWait, LButton, D
  if a_thishotkey=WheelDown
  {
    MouseClick, Left
    send, +{1}
    MouseClick, Left
    send, +{2}
  }
  else if a_thishotkey=WheelUp
  {
    MouseClick, Left
    send, ^{1}
    MouseClick, Left
    send, ^{2}
  }
  else if a_thishotkey=esc
    sleep,10  
}
Return
Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

5

Re: AHK: Как обойти KeyWait и завершить Loop

К сожалению не срабатывает... там видно где то необходим Break для полной остановки предыдущего цикла после начала нового блока

6 (изменено: Alectric, 2011-11-03 22:34:27)

Re: AHK: Как обойти KeyWait и завершить Loop

Вообщето у меня сдесь 1 цикл в котором выбирается от какой клавиши сработало зацикливание.

Кстати у меня несрабатывает по ролику, но срабатывает по нормальным клавишам:

Shift::
ctrl::
esc::
Loop
{
  KeyWait, LButton, D
  if a_thishotkey=Shift
  {
    MouseClick, Left
    send, +{1}
    MouseClick, Left
    send, +{2}
  }
  else if a_thishotkey=ctrl
  {
    MouseClick, Left
    send, ^{1}
    MouseClick, Left
    send, ^{2}
  }
  else if a_thishotkey=esc
    sleep,10  
}
Return
Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

7

Re: AHK: Как обойти KeyWait и завершить Loop

WheelDown::WD:=1, WU:=0
WheelUp::WU:=1, WD:=0
LButton::SetTimer, Action, 1
LButton Up::WD:=WU:=0

Action:
   If WU
   {
      Click
      Send, ^{1}
      Click
      Send, ^{2}
   }
   Else If WD
   {
      Click
      Send, +{1}
      Click
      Send, +{2}
   }
   Else
   {
      SetTimer, Action, Off
      Click, D
      KeyWait, LButton
      Click, U
   }
   Return

8

Re: AHK: Как обойти KeyWait и завершить Loop

В варианте Alectric скрипт почему то зависает после 3-4 циклов... Grey все работает но ожидание отпускания Lbutton не совсем то. Спасибо, попробую с помощью данных примеров собрать то что хотелось-бы в идеале:


WheelDown:: ; Переключение панели  с прекращением исполняемого (если есть) цикла
Send +{1}
Sleep 300

Loop
{
KeyWait, LButton, D ; Ожидание клика после которого спам кнопок в данном блоке и опять ожидание клика
MouseClick, Left
send, ^{1}
MouseClick, Left
send, ^{2} 
}
Return


WheelUp::  ; Переключение панели с прекращением исполняемого (если есть) цикла
Send +{2}
Sleep 300
Loop
{
KeyWait, LButton, D  ; Ожидание клика после которого спам кнопок в данном блоке и опять ожидание клика
MouseClick, Left
send, ^{1}
MouseClick, Left
Send, send, ^{2}
}
Return

F1::                            ; Прекращение исполняемого цикла (если есть) и выполнение указанного блока
;Другой блок                 
F2::                           ; Прекращение исполняемого цикла (если есть) и выполнение указанного блока
;Другой блок
F3::                           ; Прекращение исполняемого цикла (если есть) и выполнение указанного блока
;Другой блок
и т.п

Пробую вставлять :
Gosub
Label
Break
Но пока неудачно.

9 (изменено: Alectric, 2011-11-05 14:47:33)

Re: AHK: Как обойти KeyWait и завершить Loop

Попробуй так:

WheelDown::
work=1    ; Работает первый

Send +{1}
Sleep 300

Loop
{
if work<>1          ; Если работает не первый - выход из цикла
  break
KeyWait, LButton, D
MouseClick, Left
send, ^{1}
MouseClick, Left
send, ^{2}
}
Return


WheelUp::
work=2             ; Работает второй цикл

Send +{2}
Sleep 300

Loop
{
if work<>2             ; Если работает не второй - выход из цикла
  break
KeyWait, LButton, D
MouseClick, Left
send, ^{1}
MouseClick, Left
Send, send, ^{2}
}
Return

F1::   ;Другой блок
work=3
;
;
Loop
{
if work<>3
  break
;
;
}
return

и т.д. и т.п
Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

10

Re: AHK: Как обойти KeyWait и завершить Loop

Сделайте для LButton отдельный обработчик, который зависит от значения глобальной переменной. А в WheelUp/WheelDown меняйте значение этой переменной.

11

Re: AHK: Как обойти KeyWait и завершить Loop

Krotus пишет:

В варианте Alectric скрипт почему то зависает после 3-4 циклов...

А в какой момент перестает работать? У меня нормально работает.

Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

12 (изменено: Grey, 2011-11-05 15:19:44)

Re: AHK: Как обойти KeyWait и завершить Loop

Krotus пишет:

...ожидание отпускания Lbutton не совсем то.

Не вопрос, можно и по другому:

WheelDown::
   Hotkey, WheelDown,, Off
   Send, +{1}
   Sleep, 300
   WD:=WD?0:1, Counter:=WU:=0
   Sleep, 500
   Hotkey, WheelDown,, On
   Return

WheelUp::
   Hotkey, WheelUp,, Off
   Send, +{2}
   Sleep, 300
   WU:=WU?0:1, Counter:=WD:=0
   Sleep, 500
   Hotkey, WheelUp,, On
   Return

LButton::SetTimer, Action, 1

Action:
   If WU
   {
      Click
      Send, ^{1}
      Click
      Send, ^{2}
   }
   Else If WD
   {
      Click
      Send, +{1}
      Click
      Send, +{2}
   }
   Else
   {
      SetTimer, Action, Off
      Click, D
      KeyWait, LButton
      Click, U
   }
   Return

Поворот колеса включает/отключает собственный цикл, и всегда отключает другой.

13 (изменено: Alectric, 2011-11-05 15:34:11)

Re: AHK: Как обойти KeyWait и завершить Loop

Я ошибся...
Вот так точно работает:

#persistent

Loop
{
  KeyWait, LButton, D
  if work=1
  {
    MouseClick, Left
    send, +{1}
    MouseClick, Left
    send, +{2}
  }
  else if work=2
  {
    MouseClick, Left
    send, ^{1}
    MouseClick, Left
    send, ^{2}
  }
  else if work=3
    break
}
Return



Shift::work=1
ctrl::work=2
esc::work=3
Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

14 (изменено: Krotus, 2011-11-05 17:37:47)

Re: AHK: Как обойти KeyWait и завершить Loop

Grey при запуске на строке WD:=WD?0:1, Counter:=WU:=0 выдает ошибку... Александр_ Спасибо за ответ но так как я вначале поста уже сообщил что с AHK я работаю недавно многие возможные в нем функции мне пока непонятны и как их реализовать. Поэтому прошу пример скрипта. Alectric Все работает но только один раз, потом Break не срабатывает..  Хотя вижу что прописано все вроде верно но цикл упорно не прекращается поворотом колеса мыши и при переходе на как и прописано на следующий блок не прекращает цикл Loop исполняемого . В идеале дожно быть примерно так:


 Код:

WheelDown:: ; Переключение панели  с прекращением исполняемого (если есть) цикла
Send +{1}
Sleep 300

Loop
{
KeyWait, LButton, D ; Ожидание клика после которого спам кнопок в данном блоке и опять ожидание клика
MouseClick, Left
send, ^{1}
MouseClick, Left
send, ^{2} 
}
Return


WheelUp::  ; Переключение панели с прекращением исполняемого (если есть) цикла
Send +{2}
Sleep 300
Loop
{
KeyWait, LButton, D  ; Ожидание клика после которого спам кнопок в данном блоке и опять ожидание клика
MouseClick, Left
send, ^{1}
MouseClick, Left
Send, send, ^{2}
}
Return

F1::                            ; Прекращение исполняемого цикла (если есть) и выполнение указанного блока
;Другой блок                 
F2::                           ; Прекращение исполняемого цикла (если есть) и выполнение указанного блока
;Другой блок
F3::                           ; Прекращение исполняемого цикла (если есть) и выполнение указанного блока
;Другой блок

15

Re: AHK: Как обойти KeyWait и завершить Loop

Замени break на sleep,100.
Вообще это для того чтобы после нажатия на Esc левая кнопка работала как обычно.

Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

16 (изменено: Alectric, 2011-11-05 17:46:41)

Re: AHK: Как обойти KeyWait и завершить Loop

Добавил коментарии.

#persistent   ; выполнять код бесконечно


Loop
{
  KeyWait, LButton, D
  if work=1
  {
    MouseClick, Left
    send, +{1}
    MouseClick, Left
    send, +{2}
  }
  else if work=2
  {
    MouseClick, Left
    send, ^{1}
    MouseClick, Left
    send, ^{2}
  }
  else if work=3   ; если нажата клавиша Esc просто ждать 100 милисек
    sleep,100
  else if work=4   ; если нажата клавиша в которой work была задана равной 4
  {
    ; Сюда вставляй свой код
  }
  else if work=5   ; ну думаю принцип понятен уже
    sleep,100
}
Return


                   ; Все клавиши и действия для них пиши после цикла
Shift::
work=1
Send +{1}  ; добавляй сюда условия которые тебе нужны перед кликами мышкой
Sleep 300

ctrl::
work=2
; добавляй сюда условия которые тебе нужны перед кликами мышкой

esc::
work=3
; добавляй сюда условия которые тебе нужны перед кликами мышкой
Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

17 (изменено: Grey, 2011-11-05 18:14:30)

Re: AHK: Как обойти KeyWait и завершить Loop

Krotus пишет:

...на строке WD:=WD?0:1, Counter:=WU:=0 выдает ошибку...

Krotus У меня всё работает:

WheelDown::
   Hotkey, WheelDown,, Off
;   Send, +{1}
;   Sleep, 300
   WD:=WD?0:1, Counter:=WU:=0
   TrayTip,, % WD?"WD enable"
          . "`nWU disable":"WD & WU disable"
   Sleep, 500
   Hotkey, WheelDown,, On
   Return

WheelUp::
   Hotkey, WheelUp,, Off
;   Send, +{2}
;   Sleep, 300
   WU:=WU?0:1, Counter:=WD:=0
   TrayTip,, % WU?"WU enable"
          . "`nWD disable":"WU & WD disable"
   Sleep, 500
   Hotkey, WheelUp,, On
   Return

LButton::SetTimer, Action, 1

Action:
   Counter++
   If WU
   {
;      Click
;      Send, ^{1}
;      Click
;      Send, ^{2}
      ToolTip, % "action for WU (counter "Counter ")"
   }
   Else If WD
   {
;      Click
;      Send, +{1}
;      Click
;      Send, +{2}
      ToolTip, % "action for WD (counter "Counter ")"
   }
   Else
   {
      SetTimer, Action, Off
      ToolTip, action for LBM
      Click, D
      KeyWait, LButton
      Click, U
      Counter:=0
      ToolTip
   }
   Return

18

Re: AHK: Как обойти KeyWait и завершить Loop

Большое спасибо всем кто помог! С помощью приведенных примеров наконец составил то что хотел.