【问题标题】:Autohotkey send key, let it trigger other hotkeys (#InputLevel confusion)Autohotkey 发送键,让它触发其他热键(#InputLevel 混淆)
【发布时间】: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。奇数。)

(更新结束。)

我知道#InputLevelSendLevel 有一个伴随命令—这可能是相关的。我试过把它放在很多地方,但从来没有任何区别。

所以,这是简化的理论示例。将 a 重新映射到 b 到 c 在现实中当然是没有用的(最终结果当然可以通过a::c 来实现)。关于我的用例。请记住,如果事实证明“真正的”解决方案意味着做我正在尝试做的其他方式,我仍然有兴趣了解更多关于 #InputLevelSendLevel 的信息,以及为什么我的例子无法按预期工作。

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


    【解决方案1】:

    为什么不:

    a::
    ; Do something
    Send, b
    Return
    

    【讨论】:

    • 啊,我怎么能忘记那个语法?这确实让我做的事情不仅仅是重新映射。 (有趣的是,SendInput 不起作用。)不过,我必须使用Hotkey 命令,因为“comboKey​​s”是动态的——它们甚至可以由用户设置以支持除 a-z 之外的其他字符。跨度>
    • 我现在更新了这个问题。感谢并 +1 解决了简化示例中的第一个问题(能够做的不仅仅是重新映射)。
    【解决方案2】:

    据我所知,#InputLevel 不会咬Hotkey 命令。但是,我偶然发现了我最初发布的一个 sn-ps 的解决方案:

    Hotkey *a, foo
    b::c
    
    foo:
        ; Do something more here …
        SendLevel 1
        SetKeyDelay 0 ; Optional; Only affects this hotkey.
        SendEvent {Blind}b
        return
    

    请注意,必须使用SendEventSendInput 产生 bSendPlay 什么也没有产生。我不知道为什么。

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

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

    更新:

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

    更新:

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

    【讨论】:

    • SendLevel 1 给我Error: This line does not contain a recognized action.
    • 没关系,我的Autohotkey确实太旧了,只有1.1.06 and above支持
    【解决方案3】:

    现在(从 Autohotkey 1.1.01 开始),这可以很容易地实现,如下所示:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-28
      • 1970-01-01
      • 1970-01-01
      • 2021-06-18
      • 2012-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多