相关坑来自于群友需求:
短按Alt,执行A,长按Alt,执行B(长短以0.5秒为判定标准)。
再描述准确一点:
短按Alt并松开后,执行A,长按Alt并松开后,执行B(长短以0.5秒为判定标准)。
第一个坑 来自于控制键,帮助文件中称为按键修饰符
Control (或 Ctrl) | Control 键.单独作为热键(Control:: )时它在弹起时触发,不过如果加上颚化符前缀可以改变这种情况.对应的热键前缀为 ^ . |
Alt | Alt 键.单独作为热键(Alt:: )时它在弹起时触发,不过如果加上颚化符前缀可以改变这种情况.对应的热键前缀为 ! . |
Shift | Shift 键.单独作为热键(Shift:: )时它在弹起时触发,不过如果加上颚化符前缀可以改变这种情况.对应的热键前缀为 + . |
根据情况可以~Alt或LAlt
结合KeyWait,似乎可以满足需求
LAlt:: KeyWait,LAlt,T0.5 if ErrorLevel send b else send a return
实际测试,按下LAlt并在0.5秒内松开后,确实得到 a,然而超过0.5秒得到的却是 bbb……a!!!
稍微联想下 ,平时我们按住某键不放,也会有出现类似“连发”的效果,比如按a键,会出现aaa……!!!相关设置在这里:
也就是说长按LAlt,键盘发出多次LAlt,相关热键程序被触发了多次!
验证起来也很简单,开头或结尾多加一句提示即可,比如:
LAlt:: send * KeyWait,LAlt,T0.5 if ErrorLevel send b else send a return
当然,大部分游戏的按键处理和系统不同,上段代码可能有效!
那要实现需求的话,按照逻辑顺序,可以用个循环
LAlt:: while GetKeyState("LAlt","P") { } if A_TimeSinceThisHotkey<500 send a else send b return
这里又是一个坑! GetKeyState(“LAlt”)的值始终是0!
后来又想起以前做过的类似的
[双击事件]第二关:一键多用设计
http://www.autoahk.com/archives/3301
依然结合Keywait,反而简单点
LAlt:: Keywait,Alt if A_TimeSinceThisHotkey<500 send a else send b return
当然,结合LAlt Up也是一种方法。
最后,最开始给的那段代码,可以加个变量标记,加个条件判断,也是可以的,但是逻辑上很不友好,自找别扭,所以并不推荐!