【问题标题】:How to stop an infinite loop in autohotkey using the key you start it with如何使用启动它的键停止自动热键中的无限循环
【发布时间】:2020-02-09 06:16:21
【问题描述】:

所以我刚开始使用自动热键,我制作了这个脚本来在一个名为流放之路的游戏中向交易聊天发送垃圾邮件,它工作得很好,但是当我再次按 f1 时我无法让它停止,我试过无数次次,但循环不会停止

#MaxThreads 2
wintitle=Path of Exile
SetTitleMatchMode,2
DetectHiddenWindows,On
setkeydelay,2500,0
f1::
toggle:=!toggle
Loop
{
  if toggle
    controlsend,,{enter}{up}{enter}, %wintitle%
  else
    break
}
return

【问题讨论】:

    标签: loops toggle autohotkey


    【解决方案1】:

    我认为你最好使用SetTimer 来解决这个问题。在切换时,循环不是很容易使用。

    i := 0
    toggle := 0
    F1::
        toggle := !toggle
        if (toggle) {
            SetTimer, Timer_Spam, 10
        } else {
            SetTImer, Timer_Spam, Off
        }
    return
    
    Timer_Spam:
        TrayTip, Counter, %i%
        i++
    return
    

    您的循环不起作用的原因是,一旦您进入循环,程序就会卡在那里,所以要退出循环,您需要从循环内部工作。

    您可以使用GetKeyState() 执行此操作,但是您不能使用相同的键来打开和关闭它,因为它会在您启动它时立即关闭,除非您在其中添加Sleep 命令在那里,在这种情况下它变得不可靠。

    但是,您可以使用单独的键来停止循环,如下所示。

    toggle := 0
    i := 0
    F1::
        toggle := !toggle
        if (toggle) {
            Loop {
                if (GetKeyState("F2", "P")) {
                    toggle := !toggle
                    break
                }
    
                TrayTip, Counter, %i%
                i++
            }   
        }
    return
    

    但就像我上面所说的,SetTimer 以更稳定的方式实现了相同的结果。所以我会同意的。

    【讨论】:

    • 感谢您的帮助,我真的很感激,您的第二个代码有效,我所要做的就是按住 f2
    【解决方案2】:

    使用MaxThreadsPerHotkey

    #MaxThreadsPerHotkey 2
    wintitle=Path of Exile
    SetTitleMatchMode,2
    DetectHiddenWindows,On
    setkeydelay,2500,0
    return
    
    f1::
    toggle:=!toggle
    Loop
    {
    if toggle
    controlsend,,{enter}{up}{enter}, %wintitle%
    else
    break
    }
    return
    

    【讨论】:

    • 感谢您的回复,我试过了,但还是不行 - 再次按 f1 后循环继续
    【解决方案3】:

    这是我能做到的最简单的方法。

    用“2”键启动/停止切换,延迟0.1秒发送“a”。

    #MaxThreadsPerHotkey 2
    
    running := false
    stop := false
    
    ~2::
    
    if(!running) {
        running := true
    }
    else {
        stop := true
        return
    }
    
    loop {
    
        Send {a} ; example sending key "a"
    
        if(stop) {
            running := false
            stop := false
            break
        }
    
        Sleep, 100
    
    }
    
    return
    

    【讨论】:

      【解决方案4】:

      我的策略是这样的, 使用这个命令:

       v::
      loop
      {
      click
      if (GetKeyState("b")) {
      break
          }
      }
      return
      

      (其简单的自动点击器)

      【讨论】:

        【解决方案5】:

        使用 Loop 命令的工作示例。然而就这么简单。

        #Persistent
        #MaxThreadsPerHotkey 2
        toggle := False
        
        f1 UP::
        toggle := !toggle
        
        Loop {
            If (!toggle) {
                break
            }
            ; Spam commands here
        }
        Return
        

        【讨论】:

          【解决方案6】:

          这段代码做你想做的事:

          #MaxThreads 2
          wintitle=Path of Exile
          SetTitleMatchMode,2
          DetectHiddenWindows,On
          setkeydelay,2500,0
          
          return
          F1::
              Loop
              {
          
                  CheckLButton1:
                 if (GetKeyState("F1"))
                  {
                      Goto, CheckLButton1
                  }
          
                  Docode:
                  controlsend,,{enter}{up}{enter}, %wintitle%
                  ;ToolTip, 1
          
          
                  if (!(GetKeyState("F1")))
                  {
                      Goto, Docode
                  }
          
                  CheckLButton2:
                 if (!(GetKeyState("F1")))
                  {
                      return
                  }
                  else
                  {
                      Goto, CheckLButton2
                  }
              }
          return
          

          如果需要解释,请看我的帖子:http://ahkscript.org/boards/viewtopic.php?f=5&t=4613#p26298

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2018-11-16
            • 2017-10-31
            • 1970-01-01
            • 1970-01-01
            • 2021-01-31
            • 2022-11-27
            • 1970-01-01
            • 2013-03-20
            相关资源
            最近更新 更多