Autohotkey发送密钥,让它触发其他热键(#InputLevel混淆)

时间:2013-06-25 11:26:23

标签: autohotkey

我想创建一个热键,发送一些密钥,然后是另一个热键,只发送一个密钥,然后发送第三个密钥。

这似乎是可能的,使用#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来实现)。关于我的用例。请记住,如果事实证明“真正的”解决方案意味着我正在尝试以其他方式做的事情,我仍然有兴趣了解有关#InputLevelSendLevel的更多信息,以及为什么我的例子没有按预期工作。

我正在努力实施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

上述解决方案非常适合我的目的 - 除了打破用户可能做出的所有重映射和其他热键:这些根本不会发生。

3 个答案:

答案 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

请注意,必须使用SendEventSendInput生成 b SendPlay根本不产生任何东西。我不知道为什么。

但是,如果要发送热键本身,此技术将不起作用。然后你最终陷入无限循环。使用键盘钩子没有帮助,因为SendLevel会覆盖它。

所以,我有一个答案解决了一个最初的例子,但实际上并没有帮助我。我需要发送热键本身。我想我必须让用户使用我的脚本重新映射他们的密钥。叹息。

更新

我现在已经发布了my dual-role modifiers script,以防有人对更多细节感兴趣,以及我如何处理这些问题。

更新

我已经更新了我的双重角色修饰符脚本。我现在远离Hotkey命令。我认为,处理这类事情会更容易。

答案 2 :(得分:0)

到现在为止(启动Autohotkey 1.1.01),这可以很容易地实现:

~Shift up::
    IfInString, A_PriorKey, Shift
    {
        Send )
    }
return