[番外篇] AHK中的HotKey变体
# [番外篇] AHK中的HotKey变体
AB014-[番外篇] AHK中的HotKey变体
代码讨论
长岛的雪:
如果两个语境约束之间冲突,那么该如何解决?
代码讨论心如止水:
我也遇到过,印象中帮助中有说过,不记得了
如果是我的话,我会在语境约束的表达式中,加入更多限定条件,虽然写起来繁琐,但是还是能用的
虚荣:
我一般是用 ~ + if else 进行判断
思考1:HotKey 变体的覆盖规则到底是怎么样的?
如果使用"语境约束",也就是#if
,那么规则很简单
- 全局热键优先级最低
- 非全局热键,靠近脚本顶部优先级越高
如果使用 HotKey 命令中的子命令
- 全局热键优先级最低
- 非全局热键,先执行的优先级高
其实第二条,两者可以说是一回事,因为#if
是在编译的时候就生效的,所以在脚本中出现的顺序也就是执行的顺序,所以第二条其实就是:先执行的优先级高.
思考2:语境约束的原理和波浪号
其实现方式就是在热键被按下之前,由 AHK脚本 进行表达式计算.
所以,这两种写法其实基本上可以看成等价的
#InputLevel 1
~^l::
if (WinExist("itmz") AND WinActive("SciTE"))
println("OK2")
else if(WinExist("itmz"))
println("OK")
else
Send,^l
return
#If WinExist("itmz")
^l::
println("OK2")
return
#If
#If WinExist("itmz") AND WinActive("SciTE")
^l::
println("OK")
return
#If
如果加了波浪号反而不对
思考3:直觉和习惯
在大多数情况下,语境约束的方法,都会有更好的可读性
这样我们就能看清楚,在某一个条件下(比如在 SciTE 窗口存在的条件下),所有的热键是什么,有什么关联操作
但是,万一出现了变体冲突的情况,调整起来会非常麻烦,写起来会非常繁琐
一般是不会遇到这种情况的,因为官方把全局的优先级降到了最低
但在使用 GetKeyState
的时候,就经常遇到
我们希望 #if GetKeyState()
优先级最低,但我们习惯把简单的式子放在上面,所以就会出BUG.
这个时候就可以用普通的热键+if else 效果反而更好
End
心如止水是Java/AHK持续学习者,欢迎您来和我探讨Java/AHK问题 _
GitHub
欢迎您来访问我的GitHub,在这里您可以看到我的代码分享,关注我的最新动态。
欢迎给 新生的 BeanLib 投稿,每一位贡献者的名字都将被铭记。
更多文章:
- [专栏] AHK程序设计 - 简书(优先持续更新)
- [基础] [GIF动图] 绕过中文输入法发送文本的3种方法
- [基础] AHK函数对象系列-绑定函数对象v3
- [基础] AHK函数对象系列-绑定方法对象
- [基础] 在AHK中实现函数重载的效果
- [基础] AHK函数对象系列-对象属性与数据域保护v2
问题解答:
[问题解答] 示例不能运行吗? - 关于AHK程序设计系列文章示例问题的解释
版权声明:
该文章版权系“心如止水”所有,欢迎分享、转发,但如需转载,请联系QQ:3404624865,得到许可并标明出处和原链接后方可转载。未经授权,禁止转载。版权所有 ©心如止水 保留一切权利。
文章版本:
v1
v2 : 波浪线和语境约束是不一样的,想错了,更正
v3:增加示例