[教程]关于“上一次使用的热键”相关内容

上一个执行的热键名称是什么?上上次执行的热键名称是什么?两个热键开始运行的间隔时间是多久?有什么卵用?

上一个执行的热键名称是什么?上上次执行的热键名称是什么?两个热键开始运行的间隔时间是多久?有什么卵用?如果对这几个问题感兴趣,可以继续往下看。

文章内容有一些脚本,如果需要运行的话,复制粘贴进编辑器,再格式化一下代码,运行看看,自己感受一下,毕竟能重现,比文字重要一百倍。我暂时找不到添加代码的按钮,以至于代码失去了缩进···

——————————————————————————

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可以达到类似效果,就是代码多了点。

[教程]关于“上一次使用的热键”相关内容

 

[教程]关于“上一次使用的热键”相关内容

给TA捐赠
共{{data.count}}人
人已捐赠
其他教程

关于“利用鼠标切换软件窗口功能”的一点笔记

2016-11-21 1:29:39

其他教程

SciTE4AutoHotkey用户工具栏设置

2016-11-21 7:31:48

5 条回复 A文章作者 M管理员
  1. 小猴子

    😀

  2. 天甜

    最后一个脚本的运行有问题 if A_Timey<700 中的A_Timey没有这个变量啊?是最新ahk加入了的吗

    • 悠然生活

      就是A_TimeSincePriorHotkey,单纯的复制错误。我也是才发现。

  3. YanYan

    这个不错,明天测试。

个人中心
购物车
优惠劵
有新私信 私信列表
搜索