【发布时间】:2013-06-22 04:10:27
【问题描述】:
我想创建一个热键来发送一些键,然后为刚刚发送的键创建另一个热键,然后再发送第三个键。
这似乎是可能的,使用#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
上面确实给出了预期的效果:按 a 会导致 c。但是,我必须重新表述我的问题。我想问题是:我需要动态设置热键,这意味着我必须使用带有标签的Hotkey 命令(据我所知)。 (还要注意我在上面使用了SendEvent。使用SendInput 会产生一个b。奇数。)
(更新结束。)
我知道#InputLevel—SendLevel 有一个伴随命令—这可能是相关的。我试过把它放在很多地方,但从来没有任何区别。
所以,这是简化的理论示例。将 a 重新映射到 b 到 c 在现实中当然是没有用的(最终结果当然可以通过a::c 来实现)。关于我的用例。请记住,如果事实证明“真正的”解决方案意味着做我正在尝试做的其他方式,我仍然有兴趣了解更多关于 #InputLevel 和 SendLevel 的信息,以及为什么我的例子无法按预期工作。
我正在努力实现dual-role modifier keys。例如,单独按 RShift 时发送 ),而与其他键一起按时发送 RShift+key。基本上,RShift 在 keydown 上,RShift up 和 ) 在 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
上述解决方案非常适合我的目的——除了打破用户可能做出的所有重新映射和其他热键:这些根本不会发生。
【问题讨论】:
标签: autohotkey