Autohotkey 自动热键中的切换键

Autohotkey 自动热键中的切换键,autohotkey,Autohotkey,我的目标是将WASD映射到键盘上的4个箭头按钮,并在z退出时使1“挂起”脚本。那很容易。现在我希望a和d只有条件地应用。我看了这些文件,不知道这里出了什么问题。我想我要么使用了错误的if语句,要么左/右在if语句中不起作用,在这种情况下我不知道该怎么办 #SingleInstance a::if(UseAD) Left d::if(UseAD) Right 1::Suspend 2::UseAD:=!UseAD w::Up s::Down z::ExitApp 试试这个: #SingleIns

我的目标是将WASD映射到键盘上的4个箭头按钮,并在z退出时使1“挂起”脚本。那很容易。现在我希望
a
d
只有条件地应用。我看了这些文件,不知道这里出了什么问题。我想我要么使用了错误的if语句,要么左/右在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 (true)
    do this
您的多行语句也是错误的。基本上,单行热键是一个Send命令,用于该行中指定的任何键(除非您指定赋值/函数/命令等),它将充当Send命令。要进行If评估,需要多行。当您指定热键并且希望进行需要多行的评估时,您必须从多行热键返回一个子例程:

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
如果你运行这个,你会得到一个关于左边文本的错误。。。这是因为热键不是作为Send命令,而是作为一个子例程,因此我们必须用Left指定Send命令:

a::
    if(UseAD) 
        Send, Left
return
但是这也不正确,现在它发送的是Left这个词,而不是Left。。同样,我们在命名键周围添加了括号,如下所示:

a::
    if(UseAD) 
        Send, {Left}
return
好的,现在当UseAD为False时,a和b不会被发送,所以我们必须使用like so指定它们:

现在,我们运行这段代码并按a或b键,得到一条MaxHotkeys-Reach消息,因为我们的代码在一个Infinate循环中触发了热键。我们需要以这样一种方式指定代码,即它不会触发自身,如下所示:

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


在第一个代码示例中,我在Send命令上使用了一个强制表达式%和三值?:要评估UseAD,如果为真,则发送左键,如果为假,则发送信函,与上述代码完全相同,只是更加简洁。

您可以使用
2::
调用
热键
命令。它就是针对这个问题设计的,可以改变
a
/
d
的行为。
$a::
    if(UseAD) 
        Send, {Left}
    else
        Send, a
return