控制键,KeyWait以及系统字符重复的坑

相关坑来自于群友需求:

短按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……!!!相关设置在这里:

控制键,KeyWait以及系统字符重复的坑

也就是说长按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也是一种方法。

最后,最开始给的那段代码,可以加个变量标记,加个条件判断,也是可以的,但是逻辑上很不友好,自找别扭,所以并不推荐!

 

 

 

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

通过网络获取北京标准时间,分享三个目前可用的网络时间接口及获取代码

2018-4-18 14:02:05

其他

文本交互替换

2018-4-26 16:56:53

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
有新私信 私信列表
搜索