在按键上启动/停止循环仅偶尔起作用

时间:2018-07-14 17:18:51

标签: autohotkey

我想知道我的代码是否有问题。我尝试使用 F2 写一个切换代码来向 ctrl 发送垃圾邮件。它可以很好地完成垃圾邮件的工作,但是当我再次按下 F2 将其关闭时,它仅偶尔起作用。想知道垃圾邮件是否干扰了我的 F2 密钥,从而使它无法正常运行。下面是代码。另外,我是否可以使用修饰符,使代码在后台的单独窗口上运行?

F2::
Toggle := !Toggle
loop
{ If not Toggle
    { 
    Send, {LCtrl Up}   
      break
    }
   Send, {LCtrl Down}
   sleep, 200
   Send, {LCtrl Up}  
}
Return

3 个答案:

答案 0 :(得分:1)

另一种方法:

; autoexecute-section (top of the script):
loop_enabled := false ; the loop is disabled by default

#MaxThreadsPerHotkey 2 ; allows us to invoke F2 even if the previous invocation of F2 hasn't completed.

; Press F2 down to enable the loop (the $ symbol facilitates the "P" mode of GetKeyState below).
$F2:: loop_enabled := true

#If (loop_enabled) ; If you enable the loop by pressing F2 down

    $F2 Up::  ; release F2 to start the loop
        ToolTip, Looping
        Loop
        {
            Send, {LCtrl Down}
            Loop 20
            {
                If !GetKeyState("F2", "P") 
                    sleep, 10
            }
            Send, {LCtrl Up}
            If GetKeyState("F2", "P") ; by pressing F2 while the loop is enabled
            {
              Send, {Blind}{LCtrl Up}
              ToolTip
              loop_enabled := false      ; disable and
                    break                ; terminate the loop
            }
        }
    Return

#If

答案 1 :(得分:0)

您的脚本没问题。发生这种情况是因为循环控制了过程,而在那一刻,热键没有响应-设计使然。
对于此应用程序,我将整个应用程序编写为循环。这虽然不太紧凑,但是应该很健壮,并且可以清楚地说明发生了什么。

下面是一个有效的示例。
要调整重复速度,请更改T_pressT_release常量。
另外,您可以更改sleep 10来增加/减少循环的速度。

Toggle := 0
ticks := 0          ; 'clock' counter

R_prev := getkeystate("F2")

T_press := 4            ; ticks before  Ctrl press
T_release := 40     ; ticks before Ctrl release  

tooltip,  Paused

loop
{ 
    sleep 10            ; loop interval
    R := getkeystate("F2") 
    RX := (R > R_prev)
    R_prev := R
    if RX {
        if Toggle {
            Toggle := 0
            ticks := 0
            send {LCtrl up}  
            tooltip,  Paused
        } else {
            Toggle := 1
        }
    }

    if Toggle {
        ticks += 1
        if (ticks = T_press) {
            send {LCtrl down}
            ; tooltip,  Pressed -- %ticks%
        }
        if (ticks = T_release) {
            send {LCtrl up}  
            ; tooltip,  Released -- %ticks%     
            ticks := 0
        }
        tooltip,  ctrl_on: %pressed% --- %ticks%
    }
}

答案 2 :(得分:0)

另一种好的方法是使用Timers

事实证明计时器是可以中断的,因此立即停止计时器应该没有问题。 对于您的任务-诀窍是将两个计时器设置为相同的周期,并始终以偏移量启动它们。 (请参见sleep 120行)。您可以根据自己的需要调整时间和期限。

settimer, fire_stop, 400
settimer, fire, 400
settimer, fire, off
settimer, fire_stop, off

Toggle := 0

F2::
    Toggle := !Toggle
    if Toggle {
        settimer, fire_stop, on
        sleep 120                   ; offset between timers
        settimer, fire, on
        gosub fire
    } else {
        settimer, fire, off
        settimer, fire_stop, off
        gosub fire_stop
    }
return

fire:
    tooltip  "key is down"  
    send {LCtrl down}
return

fire_stop:
    tooltip  "key is up" 
    send {LCtrl up}
return