Autohotkey 发送命令,isn';自动热键没有问题吗?

Autohotkey 发送命令,isn';自动热键没有问题吗?,autohotkey,Autohotkey,所以我有一个游戏,叫做AirMech。它还不能将鼠标按钮识别为控件,所以我尝试使用自动热键来绕过它,直到它实现为止 #IfWinActive, AirMech XButton1::Send c 没用。所以我尝试了SendGame,SendPlay和其他一切,但都没有成功。我在谷歌上搜索了一下,发现有些游戏根本无法识别任何发送命令 在放弃之前,我只是尝试了一个简单的映射: #IfWinActive, AirMech XButton1::c 它确实起作用了 是否预期没有发送命令工作,但后

所以我有一个游戏,叫做AirMech。它还不能将鼠标按钮识别为控件,所以我尝试使用自动热键来绕过它,直到它实现为止

#IfWinActive, AirMech
  XButton1::Send c
没用。所以我尝试了
SendGame
SendPlay
和其他一切,但都没有成功。我在谷歌上搜索了一下,发现有些游戏根本无法识别任何发送命令

在放弃之前,我只是尝试了一个简单的映射:

#IfWinActive, AirMech
  XButton1::c
它确实起作用了


是否预期没有发送命令工作,但后者工作?如果我想触发其他操作(例如(“c”加上MsgBox),该怎么办?

自动热键能够以各种不同的方式发送击键(SendRaw/SendInput/SendPlay/SendEvent)。我不太清楚简单的映射使用什么方法,但它必须是其中之一。我的猜测是SendRaw、SendInput、SendPlay或SendEvent中的一个将与键的工作原理相同

此外#IfWinActive有时无法完全按照您的预期工作,尤其是在全屏游戏中。因此,我通常在没有#IfWinActive的情况下测试我的AHK脚本,以确保它们正常工作。一旦它起作用,我就引入条件


更新

发件人:

启动脚本时,每个重新映射将转换为一对 热键。例如,包含a::b的脚本实际上包含 改为使用以下两个热键:


我的笔记:

我怀疑原因是
a::b
起作用了,但
a::Send b
不是因为a::b如何将按钮分解和按钮启动处理程序分解为两个单独的映射。游戏的gameloop可能会轮询“keydown”状态的游戏键,如果AHK正在合成重复,则不会始终保持该状态。重新映射a_down->b_down和a_up->b_up可能会使AHK更准确地模拟按住键的动作,这对于以特定方式测试键状态的程序可能很重要(GetAsyncKeyState?)


映射中的星号表示“即使按下了额外的修改器,也会触发热键。”

自动热键能够以各种不同的方式发送击键(SendRaw/SendInput/SendPlay/SendEvent)。我不太清楚简单的映射使用什么方法,但它必须是其中之一。我的猜测是SendRaw、SendInput、SendPlay或SendEvent中的一个将与键的工作原理相同

此外#IfWinActive有时无法完全按照您的预期工作,尤其是在全屏游戏中。因此,我通常在没有#IfWinActive的情况下测试我的AHK脚本,以确保它们正常工作。一旦它起作用,我就引入条件


更新

发件人:

启动脚本时,每个重新映射将转换为一对 热键。例如,包含a::b的脚本实际上包含 改为使用以下两个热键:


我的笔记:

我怀疑原因是
a::b
起作用了,但
a::Send b
不是因为a::b如何将按钮分解和按钮启动处理程序分解为两个单独的映射。游戏的gameloop可能会轮询“keydown”状态的游戏键,如果AHK正在合成重复,则不会始终保持该状态。重新映射a_down->b_down和a_up->b_up可能会使AHK更准确地模拟按住键的动作,这对于以特定方式测试键状态的程序可能很重要(GetAsyncKeyState?)


映射中的星号表示“即使按下了额外的修改器,也可以启动热键。”

感谢您展示了另一种在游戏中避免发送问题的方法。这并不能解决大多数问题,因为它们会发出一系列指令,其间会有停顿,您必须使用send(play)。感谢您展示了在游戏中绕过send问题的另一种方法。这并不能解决大多数问题,因为它们会触发一系列指令,其间会有暂停,您必须使用send(play)。按照您的建议,我只是再次尝试了所有五个send命令,并且没有任何
#IfWinActive
,只是为了确保。无济于事:显然,none与key::key完全相同。可能是一个关键的延迟(编辑:根据上面的@RobertIlbrink,它会在中间发送暂停,所以必须解释原因)看——我在我的答案中粘贴了一段有趣的引用。基本上,a::b被转换为两个单独的详细映射。整个页面对您来说可能是一本有趣的读物。按照您的建议,我只是用所有五个Send命令进行了另一次尝试,并且没有任何
#IfWinActive
,只是为了确保这一点。无济于事:显然,none与key::key完全相同。可能是一个关键的延迟(编辑:根据上面的@RobertIlbrink,它会在中间发送暂停,所以必须解释原因)看——我在我的答案中粘贴了一段有趣的引用。基本上,a::b被转换为两个单独的详细映射。整个页面对你来说可能是一本有趣的读物。
*a::
SetKeyDelay -1   ; If the destination key is a mouse button, SetMouseDelay is used instead.
Send {Blind}{b DownTemp}  ; DownTemp is like Down except that other Send commands in the script won't assume "b" should stay down during their Send.
return

*a up::
SetKeyDelay -1  ; See note below for why press-duration is not specified with either of these SetKeyDelays. If the destination key is a mouse button, SetMouseDelay is used instead.
Send {Blind}{b Up}
return