Autohotkey 如何停止当前脚本?

Autohotkey 如何停止当前脚本?,autohotkey,Autohotkey,我有这个当前脚本,但它不会暂停,即使我把暂停脚本放在F8有办法停止当前循环吗 F7:: Loop{ Send {1} ; Pressed 1 Send {-} Send {-} Send {-} Send {-} Send {2} ; Pressed 2 Send {-} Send {-} Send {-} Send {-} } F8::Pause 我不知道这到底为什么不起作用,我会在这篇文章之后找出原因,如果我发现了,我会在中编辑。 然而,在这个脚本中有很多错误(糟糕的做法),所以我们可以很

我有这个当前脚本,但它不会暂停,即使我把暂停脚本放在F8有办法停止当前循环吗

F7::
Loop{
Send {1} ; Pressed 1
Send {-}
Send {-}
Send {-}
Send {-}
Send {2} ; Pressed 2
Send {-}
Send {-}
Send {-}
Send {-}
}
F8::Pause

我不知道这到底为什么不起作用,我会在这篇文章之后找出原因,如果我发现了,我会在中编辑。 然而,在这个脚本中有很多错误(糟糕的做法),所以我们可以很容易地为您提供一个工作版本

首先,不需要使用多个send命令。只需将所有字符放在一个send命令中

其次,不需要将这些键包装在
{}
上。只有当您想要转义具有特殊属性的密钥时,才会执行此操作。例如包装
{}
中的code>将发送文本
键而不是ALT键。(在AHK
中表示ALT修改器键)

好的,现在您的脚本如下所示

F7::
    Loop
        Send, 1----2----
return

F8::Pause
我还拆下了环周围的支架,一个衬里不需要它们。并在热键的末尾添加了
return
,虽然技术上这里不需要,但它属于那里。使用
return
停止代码执行,这就是结束非一行热键语句的方式(一行不需要)。
但在您的情况下,代码执行将永远不会退出循环,因此这并不重要

但循环仍然不会被暂停热键打断。如果你要用的话,它会有用的。因此,只需将
Send
替换为
SendInput

它还可以更快地发送钥匙,而且更可靠。如果速度太快,您可以切换回
Send
,并使用来调整速度

甚至比使用任何方式发送这些键更好的方法是将文本设置到剪贴板并发送ctrl+v。现在,这是快速和可靠的。但可能有点过分,因为要发送的字符串没有那么长。但是如果它变长了,你肯定会想这么做。
当然,这是否有效取决于您将输入发送到的对象。这里有一个简单的例子:

Clipboard := "This is a long string that's going to be sent instantly by the use of pasting it in.`nThis is a long string that's going to be sent instantly by the use of pasting it in."
F7::SendInput, ^v
但仍然是,所有这些都是不好的做法,因为我们使用的是循环。尤其是热键下的循环


现在让我们讨论一些更好的方法。但是首先让我说,如果你的整个脚本仅仅是这两个热键,那么这些在实践中没有任何实际的区别。但是,作为将来的参考,当您可能制作更大更好的脚本时,我想展示一些更好的方法

首先,通过暂停,您只需暂停整个脚本(以及所有循环和计时器等)。但你永远不会退出循环。总是在取消暂停时,循环仍将在那里运行。可能不需要。
您可以使循环包含一些条件,在这些条件下可以中断循环。满足条件时,快速且最小程度地中断循环的示例:

F7::
    BreakLoop := false
    Loop
    {
        if (BreakLoop) ;if true
            break
        ToolTip, % A_TickCount ;built in variable that holds the time, in ms, since our system was started
    }
return

F8::BreakLoop := true
但实际上,即使使用循环也可能是不好的做法。如果我们有一个更大的脚本,我们希望循环只是在后台运行。但是循环不会这样做。
因此,第二,使用a而不是循环。
基本示例:

F7::SetTimer, OurTimersCallback, 0 ;0 as in execute timer every "0" ms (as fast as possible)
F8::SetTimer, OurTimersCallback, Off ;turn off

OurTimersCallback()
{
    ToolTip, % A_TickCount
}    
很好,但我们可以做得更好。让我们使用相同的热键来切换开/关,因此我们不需要两个不同的热键:

Toggle := true
F7::
    if (Toggle)
    {
        SetTimer, OurTimersCallback, 0
        Toggle := false
    }
    else
    {
        SetTimer, OurTimersCallback, Off
        Toggle := true
    }
return

OurTimersCallback()
{
    ToolTip, % A_TickCount
}
很好,但信不信由你,我们可以做得更好,尽管这一部分在实践中没有区别。但是我们可以用一行代码来表示热键语句:

F7::SetTimer, OurTimersCallback, % (Toggle:=!Toggle) ? 0 : "Off"

OurTimersCallback()
{
    ToolTip, % A_TickCount
}
哦,好吧,那肯定有点混乱。让我来解释一下发生了什么以及它为什么起作用。
%()?:
这是什么?
使用
%
强制命令的当前参数,我们使用的是表达式语法中的行为。因此,它不是逐字解释我们键入的内容(作为一个字符串),而是理解我们正在做的很酷的事情。
然后
()?:
是三元运算符。
如果
()
中的语句计算结果为true,则使用
之前的值(在本例中为0),如果计算结果为false,则使用
之后的值(在本例中为字符串Off

切换:=!切换
变量
Toggle
与任何变量一样,以默认值nothing开始,在本例中,该值的计算结果为
false
,因此我们只说
Toggle
以值
false
开始,以使事情更简单一些

使用
:=
我们为
切换指定一个表达式(简单地说,就是一个值(在本例中))(如果您还不知道
=
:=
之间的区别,这是您应该学习的,但这是另一回事)

!切换
表示与值
切换
保持相反。
因此,与
false
(任何变量在开始时保持的默认值)相反的是
true

好的,现在
Toggle
保存值
true

我们的三元语句,
(Toggle:=!Toggle)
正在检查括号内的表达式的计算结果是否为true。
确实如此,所以我们在三元函数中选择true的值

下次(当我们再次点击F7时),变量
Toggle
已经保存了值
true

然后我们再做同样的事情。我们分配
!切换
切换
。这一次,相反的值是
false
,因此if语句的计算结果为false,因此我们在三元结构中选择false的值

然后,当再次点击F7时,我们将
Toggle
的值再次更改为相反的值。
切换
的值在真、假、真、假、真、,。。。这就是我们如何实现一个非常好的、短的切换


很长的帖子,我希望有人能学到一些东西,或者至少觉得有趣。 好