上一个执行的热键名称是什么?上上次执行的热键名称是什么?两个热键开始运行的间隔时间是多久?有什么卵用?如果对这几个问题感兴趣,可以继续往下看。
文章内容有一些脚本,如果需要运行的话,复制粘贴进编辑器,再格式化一下代码,运行看看,自己感受一下,毕竟能重现,比文字重要一百倍。我暂时找不到添加代码的按钮,以至于代码失去了缩进···
——————————————————————————
A_ThisHotkey会保存上一次使用的热键。
^q::
MsgBox,%A_ThisHotkey%
Return
会输出^q
A_priorhotkey会保存上上一次使用的热键。
A_TimeSinceThisHotkey会保存上一次热键使用开始,到程序执行到该行代码时所消耗的时间。
!e::
Sleep,1000
MsgBox,%A_TimeSinceThisHotkey%
Return
会提示1000。
A_TimeSincePriorHotkey会保存上上次热键使用开始,到执行到该代码时所消耗的时间。
!r::
MsgBox,%A_TimeSincePriorHotkey%
Return
通过反复alt+r,发现一个问题,会发送,从上上次开始,到当前行代码执行时所消耗的时间。也就是每次使用,都会激活一个计时器,需要担心的是,这个计时器是否会占用内存,是否持续计时?计时器是否反复使用?内存占用?还是说,通过记录系统时间和减法运算?
实战:
ctrl::
if A_TimeSincePriorHotkey<1000
MsgBox,123
Return
通过以上代码,发现在一秒钟内双击ctrl可以正常引起对话框,程序有效,所需功能实现。内存方面,每次代码成功执行,ahk内存占用增加0.2MB,不过不会随着时间的增加而改变。(#゚Д゚)这就尴尬了,用一次加0.2,那牺牲就有点大了。
我花了好多时间去找原因···终于找到了···正经常驻ahk尽量少用Magbox!全是这货的锅···使用run代替之后,内存占用顿时降低,但经过测试,还是会上涨,每激活8次,增加0.1MB。
Ctrl::
(A_TimeSincePriorHotkey<400)?(x++):(x:=0)
Return
!q::MsgBox,%x%
Return
代码使用了“三元运算符”,文档中说明“var := x>y ? 2 : 3,当 x 大于 y 时保存 2 到 Var;否则保存 3。”
测试结果,单击ctrl,读取数据,为0;双击ctrl,读取数据,为1;连击ctrl并在400毫秒内读取数据,得到大于1的数,x自增有效。
猜测,A_TimeSincePriorHotkey在这里的作用,可能类似于超时。每次激活这个代码,就会有一个定时器开始工作,在这个例子中,单击ctrl,超过400毫秒,false,x=0;在连击的时候,第一个延时开始,第二个ctrl按下,第一个延时完成,true,同时第二个延时开始,第三个ctrl按下,以此类推,直到最后一个ctrl完成了上一个延时,自己400延时超时,false,所以,在这个例子中,点击一次,false,点击多次,最后一次是false,其余都是true。
Ctrl::
(A_TimeSincePriorHotkey<400)?(x++):(x:=0)
if x>0
{
Run,notepad
}
Return
!q::MsgBox,%x%
Return
测试结果,单击一次,读取数据,0,正常;双击,打开记事本,读取数据,1,正常;连击,连击次数6,打开文本5个,读取数据5。不对,文本应该打开3个才对。
猜测是因为变量x的值会因为自增,在if判断的时候一直为true所以每当激活一次就会打开一个文档。在做其它测试的时候,发现x的值会根据自增一直在长,所以把判断语句改成x=1,掐掉自增的x,测试效果为,在400毫秒内,不论触发多少次热键,x上升到多少,都只会触发一个文本文档,到此为止,这个热键的功能实现,任务完成,撒花~
最终语句——不论点击多少次,都只能生效一次,冷却时间400毫秒。
Ctrl::
(A_TimeSincePriorHotkey<400)?(x++):(x:=0)
if x=1
{
run,notepad
}
Return
如果在每一次延时超时前都能点击,那么,x会因为每一次热键触发自增而一直增加。
——————————————————————————————
P.S.考虑到有可能,我需要连续使用该热键,那400毫秒的限制就会让我等待400毫秒后才能使用下一次的功能,而如果直接修改数字,我也无法确定自己的手速究竟多少才合适。第一次点击,开始400毫秒延时,等待,超时false,0;第一次点击,开始延时,等待,完成第二次点击,true,1,开始第三次延时,等待,完成,true,1,以此类推除最后一个外,前面的都会是true,1,文本会一直打开。
那么,如果让第二次而不是最后一次点击直接false,那么前一次延时就中断,第二次延时继续等待。
修改前——(A_TimeSincePriorHotkey<400)?(x++):(x:=0)
修改后——(A_TimeSincePriorHotkey<400&&x=0)?(x++):(x:=0)
将x=0加入判断,当x=1的时候,下一次点击引起false,x=0,下一次点击引起true,如此循环。
完结撒花~
最终代码——只要点击次数够,就反复生效。
0P.S.关于代码规范,之前条件语句一直没用括号,时间长了误以为ahk的语法很宽松,导致代码调试的时候遇到了各种奇葩问题,而这一切仅仅因为我代码格式不对。
——————————————————————————————
考虑到有可能要使用三连击ctrl去实现某种功能,那么可以给if判断语句使用>0,<0,=0三种,也可以使用=1,=2,=3这种。
——————————————
我失败了多次,终于,放弃基于变量的判断,决定改用函数内置的时间。
最终代码——间歇性生效
Ctrl::
if A_TimeSincePriorHotkey<700
{
if A_TimeSincePriorHotkey<200
{
Send #1
Sleep,700
}
Else
{
send #2
Sleep,700
}
}
在200毫秒内完成连击,激活#2窗口,在200毫秒至1000毫秒之间,激活#1窗口。通过缓、急来分隔,也能达到类似三连击的效果。如果需要三连击,只要再嵌套条件语句就行。
————————————————————————————————
有更好的方法完成这种效果。keywait用来等待单个按键,而A_TimeSincePriorHotkey这些内置函数,用来等热键组合键,可以说是各有优势。比如说双击ctrl+c,这样的功能keywait就无法办到;而对于单个按键的功能,keywait绝对要好用很多。
相对来说,keywait更加具有针对性,必须要等待某个按键,代码可能要针对不同的使用场景进行调教,毕竟时间并不是那么容易掌握的。A_TimeSincePriorHotkey就能做快速反应,不过keywait可以达到类似效果,就是代码多了点。
😀
最后一个脚本的运行有问题 if A_Timey<700 中的A_Timey没有这个变量啊?是最新ahk加入了的吗
就是A_TimeSincePriorHotkey,单纯的复制错误。我也是才发现。
这个不错,明天测试。
嗯嗯