我想创建一个热键,发送一些密钥,然后是另一个热键,只发送一个密钥,然后发送第三个密钥。
这似乎是可能的,使用#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 + 键 。基本上,keydown上的 RShift ,以及keyup上的 RShift up 和)。但是,这有一个缺陷:即使将 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
上述解决方案非常适合我的目的 - 除了打破用户可能做出的所有重映射和其他热键:这些根本不会发生。
答案 0 :(得分:3)
为什么不:
a::
; Do something
Send, b
Return
答案 1 :(得分:0)
据我所知,#InputLevel
不会对Hotkey
命令感到厌恶。但是,我偶然发现了我最初发布的一个片段的解决方案:
Hotkey *a, foo
b::c
foo:
; Do something more here …
SendLevel 1
SetKeyDelay 0 ; Optional; Only affects this hotkey.
SendEvent {Blind}b
return
请注意,必须使用SendEvent
。 SendInput
生成 b 。 SendPlay
根本不产生任何东西。我不知道为什么。
但是,如果要发送热键本身,此技术将不起作用。然后你最终陷入无限循环。使用键盘钩子没有帮助,因为SendLevel
会覆盖它。
所以,我有一个答案解决了一个最初的例子,但实际上并没有帮助我。我需要发送热键本身。我想我必须让用户使用我的脚本重新映射他们的密钥。叹息。
更新
我现在已经发布了my dual-role modifiers script,以防有人对更多细节感兴趣,以及我如何处理这些问题。
更新
我已经更新了我的双重角色修饰符脚本。我现在远离Hotkey
命令。我认为,处理这类事情会更容易。
答案 2 :(得分:0)
到现在为止(启动Autohotkey 1.1.01),这可以很容易地实现:
~Shift up::
IfInString, A_PriorKey, Shift
{
Send )
}
return