我想创建一个发送一些键的热键,然后为刚刚发送的键创建另一个热键,然后发送第三个键。
这似乎是可能的,使用#InputLevel
:
#InputLevel 1
a::b
#InputLevel 0
b::c
以上按预期工作:按a我得到c。
但是,我不仅想重新映射第一个密钥:我还想在发送密钥之前做更多事情。所以我想我可以稍微重写一下上面的内容:
#InputLevel 1
Hotkey *a, foo
#InputLevel 0
b::c
foo:
; Do something more here …
SendInput {Blind}b
return
然而,上述内容并没有按预期工作:按a我得到b(不是c)。
更新:@Robert Ilbrink 提醒我,您可以执行多个命令,而无需使用Hotkey
命令:
#InputLevel 1
*a::
; Do something here …
SendEvent {Blind}b
return
#InputLevel 0
b::c
以上确实给出了预期的效果:在c中按下a结果。但是,我必须重新表述我的问题。我想问题是:我需要动态设置热键,这意味着我必须使用带有标签的命令(据我所知)。(还要注意我在上面使用。使用产生 a b。奇数。)Hotkey
SendEvent
SendInput
(更新结束。)
我知道有一个伴随命令#InputLevel
—<a href="http://l.autohotkey.net/docs/commands/SendLevel.htm" rel="nofollow"> SendLevel
—这可能是相关的。我试过把它放在很多地方,但从来没有任何区别。
因此,这是简化的理论示例。将 a 重新映射到 b 到 c 在现实中当然是没有用的(最终结果当然可以通过 实现a::c
)。关于我的用例。请记住,如果事实证明“真正的”解决方案意味着做我正在尝试以其他方式做的事情,我仍然有兴趣了解更多关于#InputLevel
and的信息SendLevel
,以及为什么我的示例不能按预期工作。
我正在努力实现双重角色修饰键。例如,单独按下RShift时发送),但与其他键一起按下时发送RShift+键。基本上,RShift on keydown,RShift up and ) on keyup。但是,这有一个缺陷:即使将RShift与其他键结合使用,仍然会发送) 。所以脚本需要知道什么时候有组合。我的解决方案是为所有字母键、箭头键和其他一些键添加热键,如下所示:
for comboKey in filteredComboKeys {
Hotkey % "*" comboKey, Dual_comboKey
}
; Later in script:
Dual_comboKey:
; The following function lets the dual-role modifier keys know that they have
; been combined with another key (and a few other things, which I don't think
; are important for the issue.)
Dual.combo() ;
key := Dual.cleanKey(A_ThisHotkey)
SendInput {Blind}%key%
return
上面的解决方案非常适合我的目的——除了打破用户可能做出的所有重新映射和其他热键:这些根本不会发生。