【问题标题】:Auto Hot Key - can't interrupt a loopAutohotkey - 不能中断循环
【发布时间】:2020-03-18 11:36:35
【问题描述】:

这是一个示例自动热键脚本:

^j::
WinActivate, MyWindow
WinWaitActive, MyWindow

Loop
{
    If GetKeyState("Shift", "P") 
        Break  

    Click, 44, 55
    Sleep, 1000
    Click, 144, 155
    Sleep, 1000
}

return

一切正常,但我无法通过按“Shift”来中断循环。怎么了?

【问题讨论】:

    标签: autohotkey


    【解决方案1】:

    由于睡眠时间,您必须按住 Shift 键超过 2 秒。 或者试试这样的:

    ^j::
    Loop
    {
        If !WinActive("MyWindow")
        {
            WinActivate, MyWindow
            WinWaitActive, MyWindow
        }
            Click, 44, 55
            Sleep_1000()
            Click, 144, 155
            Sleep_1000()
    }
    return
    
    Sleep_1000(){
        Loop 10
        {
            Sleep, 100
            If GetKeyState("Shift", "P") 
                exit ; terminate the hotkey's thread
        }
    }
    

    【讨论】:

      【解决方案2】:

      在热键定义中使用循环是不好的做法。
      AHK 不提供真正的多线程,因此长时间运行的循环通常是一个非常糟糕的主意。
      使用timer 修复这个问题,无论如何,计时器的使用总是你想要的。
      而且它也会简单得多。

      因此,我们使用Ctrl+j 激活所需的窗口并创建计时器并告诉它每 2 秒运行我们的函数 TimerCallback(我们将很快创建):

      ^j::
          WinActivate, MyWindow
          WinWaitActive, MyWindow ;shouldn't be needed, but if you find it helpful, fair enough
          TimerCallback() ;run the function once, since the timer is going to
                          ;run it for the first time only after 2secs
          SetTimer, TimerCallback, 2000
      return
      

      然后我们将 shift 设置为关闭计时器的热键。我们肯定希望在触发热键时使用~ modifier 不消耗密钥:
      ~Shift::SetTimer, koira, Off

      现在让我们定义我们的函数TimerCallback

      TimerCallback()
      {
          Click, 44, 55
          Sleep, 1000
          Click, 144, 155
      }
      

      如果有什么不清楚的地方,这里又是完整的脚本:

      ^j::
          WinActivate, MyWindow
          WinWaitActive, MyWindow ;shouldn't be needed, but if you find it helpful, fair enough
          TimerCallback() ;run the function once, since the timer is going to
                          ;run it for the first time only after 2secs
          SetTimer, TimerCallback, 2000
      return
      
      ~Shift::SetTimer, TimerCallback, Off
      
      TimerCallback()
      {
          Click, 44, 55
          Sleep, 1000
          Click, 144, 155
      }
      

      【讨论】:

      • 它可以工作,但我检查了程序中鼠标事件之间的间隔,它等于:~1200 ms(点击,44、55 -> 点击,144、155)和~800ms。为什么?
      • 在脚本顶部设置SetDefaultMouseSpeed,让您的鼠标立即移动。同样在最坏的情况下,睡眠可能不准确到 20 毫秒,请阅读更多关于它的信息 here。仍然不确定这是否应该解释您所看到的两个方向的 200 毫秒。或者默认的鼠标移动速度可能要慢得多。或者你用来测量的任何程序都不是很好。
      猜你喜欢
      • 2013-04-18
      • 2017-03-05
      • 2016-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多