在 autohotkey 中切换键

Toggle keys in autohotkey

我的目标是将 WASD 映射到键盘上的 4 个箭头按钮,并在 z 退出时制作 1 'Suspend' 脚本。这很容易。现在我希望 ad 仅有条件地申请。我查看了文档,但不知道这里出了什么问题。我想我要么错误地使用了 if 语句,要么 Left/Right 在 if 语句中不起作用,在这种情况下我不知道该怎么做。

#SingleInstance
a::if(UseAD) Left
d::if(UseAD) Right
1::Suspend
2::UseAD:=!UseAD
w::Up
s::Down
z::ExitApp

试试这个:

#SingleInstance
$a::Send % UseAD ? "{Left}" : "a" 
$d::Send % UseAD ? "{Right}" : "d" 
1::Suspend
2::UseAD:=!UseAD
w::Up
s::Down
z::ExitApp

好的,现在开始分解。

您的 If 语句未被正确评估。满足条件后的下面这行代码就是运行。像这样:

If (true)
    do this

您的 Hotkey 对于多行语句也是错误的。本质上,单行热键基本上是一个发送命令,用于该行上指定的任何一个或多个键(除非您指定 assignment/function/command 等...),它将充当发送命令。进行 If 评估需要多行。当您指定一个热键并且您想要一个需要多行的评估时,您必须 return 来自与子例程相同的多行热键:

a::
   Code goes here
   more code
   etc..
Return 

b::AnotherHotkey 

etc..

好的,让我们用您的代码插入此逻辑:

#SingleInstance
a::
    if(UseAD) 
       Left
return

d::
   if(UseAD) 
       Right
return

1::Suspend
2::UseAD:=!UseAD
w::Up
s::Down
z::ExitApp

如果你运行这你会得到一个关于文本左侧的错误......这是因为我们的热键不是作为发送命令而是作为子例程,所以我们必须指定发送命令左边:

a::
    if(UseAD) 
        Send, Left
return

但这也不正确,现在它发送单词 Left 而不是 Key left.. 所以我们再次在命名键周围添加括号,如下所示:

a::
    if(UseAD) 
        Send, {Left}
return

好的,现在ab在UseAD为False时不发送,所以我们必须Send them by specifying with Else这样:

a::
    if(UseAD) 
        Send, {Left}
    else
        Send, a
return

现在我们 运行 此代码并按 ab 得到一个 Max Hotkeys reached 消息,因为我们的代码正在触发Infinate 循环中的热键。我们需要以不会触发自身的方式指定我们的代码,如下所示:

$a::
    if(UseAD) 
        Send, {Left}
    else
        Send, a
return

如果您注意到我们在热键前面添加了一个 $ 符号,这会向该热键添加一个键盘挂钩,并防止脚本本身触发该热键。现在这是一个完整的工作脚本,但看起来与我发布的第一个代码完全不同。那是因为如果可以的话,我喜欢少打几行。

在第一个代码示例中,我在 Send 命令和 Ternary ? : 判断UseAD true send Left key if false send the letter,和上面的代码完全一样,只是更简洁。