问题
您好,我是一般的编码新手,想知道我是否可以过早地结束自动键中的循环功能。例如,在下面的代码中,如果我按下按钮 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 按钮一定的秒数,它会相应地发送上面的字母。感谢您阅读这篇相当长的帖子。
答案 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
}