我的目标是将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
答案 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,则发送字母,与上面的代码完全相同,只是更简洁。