在 autohotkey 中切换键
Toggle keys in autohotkey
我的目标是将 WASD 映射到键盘上的 4 个箭头按钮,并在 z 退出时制作 1 'Suspend' 脚本。这很容易。现在我希望 a
和 d
仅有条件地申请。我查看了文档,但不知道这里出了什么问题。我想我要么错误地使用了 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
好的,现在a和b在UseAD为False时不发送,所以我们必须Send them by specifying with Else这样:
a::
if(UseAD)
Send, {Left}
else
Send, a
return
现在我们 运行 此代码并按 a 或 b 得到一个 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,和上面的代码完全一样,只是更简洁。
我的目标是将 WASD 映射到键盘上的 4 个箭头按钮,并在 z 退出时制作 1 'Suspend' 脚本。这很容易。现在我希望 a
和 d
仅有条件地申请。我查看了文档,但不知道这里出了什么问题。我想我要么错误地使用了 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
好的,现在a和b在UseAD为False时不发送,所以我们必须Send them by specifying with Else这样:
a::
if(UseAD)
Send, {Left}
else
Send, a
return
现在我们 运行 此代码并按 a 或 b 得到一个 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,和上面的代码完全一样,只是更简洁。