在autohotkey中切换键

时间:2016-05-03 23:32:03

标签: autohotkey

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

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

1 个答案:

答案 0 :(得分:1)

试试这个:

#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对于多行语句也是错误的。基本上单个排列的热键基本上是一个发送命令,用于指定该行上指定的任何键或键(除非您指定赋值/函数/命令等...)它将充当发送命令。要进行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

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

a::
    if(UseAD) 
        Send, Left
return

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

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

好的,当UseAD为False时,现在 a b 没有被发送,所以我们必须通过Send来指定它们Else这样:

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

现在我们运行此代码并按 a b 获取Max Hotkeys到达消息,因为我们的代码在Infinate循环中触发了Hotkey。我们需要以这样一种方式指定我们的代码:它不会触发它自己,如下所示:

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

如果您注意到我们在热键前添加了一个$符号,则会向该热键添加一个键盘Hook,并阻止该脚本触发该热键本身。现在这是一个完整的工作脚本,但看起来与我发布的第一个代码完全不同。那是因为我愿意输入更少的线条。

在第一个代码示例中,我在Send命令和Ternary上使用Forced Expression%? :评估UseAD,如果为true,则发送左键,如果为false,则发送字母,与上面的代码完全相同,只是更简洁。