【问题标题】:Conditional Key Remapping AHK条件键重映射 AHK
【发布时间】:2021-01-02 01:50:50
【问题描述】:

我想重新映射“j”键,以便在 ergo 为真时按下 n,或在 AutoHotKey 为假时按下 y。例如,当我通常使用“j::n”重新映射时,shift+j 输出一个大写 N,其他使用“j”键的修饰符也是如此。但是,我下面的代码仅在没有修饰符的情况下按下字母时才有效。有没有办法解决这个问题,并有条件地使用 AutoHotKey 重新映射键?

j::
    if (ergo) ;inverted use of the ergo variable to make the code more efficient
        Send {n}
    else
        Send {y}
return

【问题讨论】:

    标签: autohotkey


    【解决方案1】:

    您只想在{ } 的发送命令中包装具有special meaning 的字符。基本上是逃避,如果你熟悉那是什么。
    因此,您不想将 ny 包装在 { } 中。它甚至可以导致undesired behavior

    有很多方法可以做到这一点。不能说哪个最好,因为不知道你的完整脚本是什么样的。
    我将介绍两个我认为最适合您的选项。


    首先,像您尝试过的发送命令方式。做对了:

    *j::
        if (ergo)
            SendInput, {Blind}n
        else
            SendInput, {Blind}y
    return
    

    因此,使用 *(docs) 修饰符,即使按住额外的修饰符,热键也能正常工作。
    然后使用blind send mode,这样您在触发热键时可能持有的任何修饰键都不会被释放。
    也切换到SendInput,因为它是推荐的更快、更可靠的发送模式。


    第二种方法是使用#If(docs) 创建一个上下文相关热键。

    #If, ergo
    j::n
    #If
    j::y
    

    这是一种方便且简单的方法。但可能会导致其他问题。
    为什么? #If 有一些缺点,您可以阅读更多关于 here 的信息,但长话短说:
    除非您有更复杂的脚本,否则您可能不会遇到任何麻烦。

    【讨论】:

    • 谢谢。那行得通。我使用了第二种方式,因为它不会干扰我的其余代码,而且行数更少。
    【解决方案2】:

    例如,当我正常使用“j::n”重新映射时,shift+j 输出一个大写 N,其他使用“j”键的修饰符也是如此。 但是,我下面的代码只有在没有修饰符的情况下按下字母时才有效

    看起来您正在寻找通配符 * 修饰符。

    来自docs

    通配符:即使按住额外的修饰符也可以触发热键。这通常与重新映射键或按钮一起使用。

    因此,在此更改之后,您的代码将如下所示:

    *j::
        if (ergo) ;inverted use of the ergo variable to make the code more efficient
            Send {n}
        else
            Send {y}
    return
    

    【讨论】:

    • 感谢您的帮助。但这并不能完全解决我的问题。使用您的代码,当我按 shift 和“J”时,它仍会输出小写字母“n”。我想要它做的是当我按下shift和'J'时输出一个大写字母'N'。
    猜你喜欢
    • 1970-01-01
    • 2015-05-01
    • 2021-09-27
    • 2015-12-27
    • 2021-04-12
    • 2019-06-28
    • 2013-04-30
    • 1970-01-01
    • 2020-01-27
    相关资源
    最近更新 更多