AUTOHOTKEY:单击键后暂停脚本并在单击 2 个其他键后取消暂停脚本的代码有问题。同时做两件事

AUTOHOTKEY: Problem with code which suspend script after clicking key and unsuspend it after clicking 2 another keys. Doing 2 things at the same time

在游戏中聊天以 t 键开始,我希望在按下键盘上的 t 后我的脚本将被挂起,我将可以正常地在聊天中书写,但如果我按 enter 或 esc 我的脚本将被取消挂起(esc - 关闭聊天,输入 - 在聊天中发送消息)。

我对这段代码有疑问:

t::
Suspend On
Loop
{
    GetKeyState, state, Enter, P
    GetKeyState, state2, Escape, P
    if (state = Enter){
        Suspend Off 
        break
    }   
    else if (state2 = Escape){
        Suspend Off
        break
    }   
}
return

此代码的主要问题是无法正常工作的循环,我不知道如何修复它或将其替换为更有用或更好的解决方案。

另一个问题是 t 键有效,但我必须点击它 2 次,为什么?第一次点击暂停脚本,第二次点击 运行s 聊天。我希望在点击 1 次 t 键后聊天将 运行 并且脚本将暂停。我想使用 enter 和 esc,同时执行 2 个功能(enter - 取消挂起脚本并在聊天中发送消息,esc - 关闭聊天并取消挂起脚本)

问题出在(已弃用的遗留)GetKeyState 命令的使用上,但我必须说,整个解决方案可以实施得更好。
命令的输出值不包含键名,它包含 D 表示向下,或 U 表示向上,如 documentation 中所述。而且你还需要 "quote" 你的字符串。

而您的 T 键在第一次按下时不起作用的问题,当然是因为您有一个热键可以捕获 T 键的按下。
要在热键运行时不使用 T 键,您需要使用 ~ 修饰符(docs).


但无论如何,我认为更好的实现方式是简单地按下按键 suspends/unsuspends。
像这样:

~t::Suspend, On

~Enter::
~Esc::Suspend, Off

作为奖励:
#IfWinActive(docs) 的用法可能是可取的,这样热键仅在您的游戏处于活动状态时才有效。

#IfWinActive, ahk_exe ExeOfMyGame.exe
~t::Suspend, On

~Enter::
~Esc::Suspend, Off
#IfWinActive

我把代码改成这样:

~t::
    Suspend On
    Loop
        if (GetKeyState("Enter", "P") || GetKeyState("Escape", "P"))
            break
    Suspend Off
return

为什么?因为在 @0x464e 中,当我手动暂停脚本并单击 enter / esc 取消暂停时,代码就是那个问题,我需要在单击 T 后暂停它,只有 enter / esc 才能取消暂停它。当我在上面的代码中手动挂起它时,请输入/退出不要取消挂起它。