在AutoHotKey(以下简称AHK)中,和其它多数编程语言不同,并未实现对双击事件的判断。因此,为了实现对双击事件的判断,需要由我们自己编写脚本来实现此功能。
1.解决思路
为了判断双击(三击或者更多也是可以的)事件,以鼠标右键为例,我们可以在第一次按下鼠标右键后,判断此后的一段时间(例如,400ms),用户是否第二次按下了鼠标右键。如果用户没有第二次按下鼠标右键,则将其视为第一类行为,如果用户有按下第二次按键,则将其视为第二类行为;以此类推。流程图如下:
2.简单实现
根据如上思路,编写如下代码:
; 用于统计按键次数 gnPressCount := 0 $RButton:: { gnPressCount += 1 if gnPressCount = 1 SetTimer, ProcSubroutine, 400 Return } ProcSubroutine: { ; 在计时器事件触发时,需要将其关掉 SetTimer, ProcSubroutine, Off If gnPressCount = 1 { ; 第一类行为 ; 在此处,我将其设为和通常的鼠标右键一样的功能,也即打开上下文菜单 Send {AppsKey} }Else If gnPressCount = 2 { ; 第二类行为 MsgBox, 触发双击鼠标右键事件 }Else { MsgBox, 触发三击鼠标右键事件 } ; 在结束后,还需要将鼠标右键的按键次数置为0,以方便下次使用 gnPressCount := 0 Return }
3.优化方案
优化一、将一定时间内的按键次数改为在一定时间内不在按此按键才触发
但是呢,上面的代码还是有一些不足的。
譬如,我们如果想要判断更多次的按键事件(虽然一般人不会这么做,再见!),那么,400ms的限制就使得这个情况变得不太友好了。
于是做出如下改进。
#SingleInstance Force ; 用于统计按键次数 gnPressCount := 0 $RButton:: { gnPressCount += 1 SetTimer, ProcSubroutine, Off SetTimer, ProcSubroutine, 300 Return } ProcSubroutine: { ; 在计时器事件触发时,需要将其关掉 SetTimer, ProcSubroutine, Off If gnPressCount = 1 { ; 第一类行为 MsgBox, 触发单击鼠标右键事件 }Else If gnPressCount = 2 { ; 第二类行为 MsgBox, 触发双击鼠标右键事件 }Else { MsgBox, 触发三击鼠标右键事件 } ; 在结束后,还需要将鼠标右键的按键次数置为0,以方便下次使用 gnPressCount := 0 Return }
之前有个专题专门探讨过吧!
刚看到这是之前的教程
学习
所以 gn 的全称是?(来自小白的仰望)