Autohotkey:每当我释放按钮时,过早地在特定点结束长循环。 (如果没有寻找除循环之外的其他命令)

时间:2015-02-14 05:18:24

标签: autohotkey

问题

您好,我是一般的编码新手,想知道我是否可以过早地结束自动键中的循环功能。例如,在下面的代码中,如果我按下按钮 x 并释放它,它会以一秒的间隔键入b,s,c,y和u。我想要的是如果我按 x 一秒然后释放 x ,它会发送b然后终止循环。如果我按 x 两秒钟,它会发送b和s然后终止,等等。现在的问题是,无论我点击 x 一两秒钟,等等,它完成循环,发送b,s,c,y和u。

*$x::
While(GetKeyState("x", "P"))
{
send b
Sleep 1000
send s
Sleep 1000
send c
Sleep 1000
send y
Sleep 1000
send u
Sleep 1000
}
Return

寻找解决方案

因为我不熟悉autohotkey和编码,所以我能想到的只是使用循环,但我认为在这种情况下使用它是错误的。我正在寻找解决方案,上面的代码不必是循环(重复)。我想要的只是按下 x 按钮一定的秒数,它会相应地发送上面的字母。感谢您阅读这篇相当长的帖子。

2 个答案:

答案 0 :(得分:1)

x::
  index:="i"
  letters:="l"
  output:="o"
  l:="bscyu"
  i:=(i<o0?++i:1)
  StringSplit,o,l
  send % o%i%
  sleep,1000
return

x Up::i:=0

答案 1 :(得分:0)

我可以看到一些可能的方法。

1)第一个也许最糟糕的是在每次发送之后有一个if ...来测试keystate和exit。这是非常重复的,但是如果你把它放在一个函数中就不会太糟糕,只需要调用它,例如:

*$x::
while (GetKeyState("x", "P")) {
    sendStuff('b')
    sendStuff('s')
    sendStuff('c')
...
}

sendStuff(str) {
    Send str
    if (!GetKeyState("x", "P")) {
        exit
    }
    sleep 1000
}

2)接下来是继续按原样操作,使用链式系列命令,并在运行时使用外部单独脚本杀死一系列命令,然后在您希望时重新Run()脚本重启。常见问题解答中包含了杀死外部脚本的信息:http://www.autohotkey.com/docs/FAQ.htm#close

这里有三个相关部分有点长,可以粘贴在这里,但总的来说,您可能对以下命令感兴趣:

; Allow script's hidden main window to be detected.
DetectHiddenWindows On
; Avoid need to specify full path of file.
SetTitleMatchMode 2
; Kill another script: Update params to the script's case sensitive name.
WinClose Script Filemame.ahk - AutoHotkey
; Suspend other script.
PostMessage, 0x111, 65305,,, Script Filename.ahk - AutoHotkey
; Pause other script.
PostMessage, 0x111, 65306,,, Script Filename.ahk - AutoHotkey
; Pause/resume current script on Ctrl+Alt+P
^!p::Pause

3)还有一个更长的代码示例,它描述了取消循环,我相信这是解决这个问题的正确方法,因为它最初可能会很狡猾,它具有更高的可扩展性,减少了代码重复,并允许您在一个地方处理多个循环进入/退出条件。

简而言之,就编程风格而言,它是最好的。

将要发送的条目(b,s,c,y,u)放入字符串,数组或其他可迭代的数据结构中,然后迭代它,以便while循环只发送一个项目和一个暂停每次迭代。然后,当你下次点击热键时,你可以从你离开的地方恢复循环,或者重新开始,这取决于你是否保持指向结构中当前位置的指针。

例如,使用上面的sendStuff函数,循环将为您提供非常强大且简单的可扩展性:

*$x::
{
    letters = b,s,c,y,u
    Loop, parse, letters, `,
        sendStuff(%A_LoopField%)
    return
}