条件键重映射 AHK

时间:2021-01-01 07:12:19

标签: autohotkey

我想重新映射 'j' 键,以便它在 ergo 为 true 时按 n,或者在 AutoHotKey 为 false 时按 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

2 个答案:

答案 0 :(得分:2)

您只想将具有 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 的更多信息,但长话短说:
除非您有更复杂的脚本,否则您可能不会遇到任何问题。

答案 1 :(得分:1)

<块引用>

例如,当我正常使用“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
相关问题