我想要一个简单的程序来在我按下一个键时冻结/解冻输入

Posted

技术标签:

【中文标题】我想要一个简单的程序来在我按下一个键时冻结/解冻输入【英文标题】:I want a simple program to freeze/unfreeze input when I press a key 【发布时间】:2021-03-27 15:12:21 【问题描述】:

这似乎是一件很简单的事情,但我在任何地方都找不到。我想要一个简单的程序(比如 AutoHotkey,但我找不到使用 AutoHotkey 的方法),它会冻结我的键盘和鼠标(无论我当时按下什么,都会一直按下,即使我释放了实际的键/button)当我按下某个键时,并保持冻结状态,直到我再次按下该键(所选键永远不会被其他程序视为按下)。

我只是想要这样,如果游戏希望我按住某些按钮,我可以按下按钮,按下指定的键,松开,然后在我应该释放按钮时再次按下键。

【问题讨论】:

我不认为这真的是“这么简单的事情”。有许多不同的方式可以实现这一点,不同的方式会有不同的工作方式。您的游戏究竟需要哪种方式也是需要考虑的。需要知道您的游戏如何处理输入。如果它是原始/直接输入,则需要您寻求更高级的解决方案。 @0x464e 好吧,我制作了一个 AutoHotkey 脚本,它执行预定义的输入,并且按预期工作。如果有办法让 AutoHotkey 做我正在寻找的事情,那么它将适用于我目前关心的游戏,如果它以后不能与其他东西一起使用,那么我可能会担心。 【参考方案1】:

这适用于文本编辑器。不过不确定它在游戏中的工作原理。

#NoEnv
#Warn
#SingleInstance Force
#UseHook
SetWorkingDir %A_ScriptDir%
SendMode Input

Global isHold := false ; Alternates between "true" and "false" at each "LShift" press.

; Hotkey below will only be active if the game's window is active
#IfWinActive "PutYourGameWindowTitleHere"

; Sends LShift Down if isHold == false, LShift Up if isHold == true
; Asterisk means it will work even if other keys are held at the same time.
*LShift::Send % (isHold := !isHold) ? "LShift Down" : "LShift Up"

#IfWinActive 

更新:同样,您必须自己在游戏中进行测试。

#NoEnv
#Warn
#SingleInstance Force
#UseHook
SetWorkingDir %A_ScriptDir%
SendMode Input

Global aKeysToFreeze :=  LShift: false, a: false , isFreezeOn := false

`::fToggleFreeze()

^`:: ; You can use this to check the logical state of the key
If GetKeyState("a")
    msgbox Key is pressed.
else msgbox Key is not pressed.
return

fToggleFreeze() 
    Local
    Global aKeysToFreeze, isFreezeOn
    
    If isFreezeOn                           ; If there are frozen keys,
        For sKeyName, isKeyFrozen in aKeysToFreeze 
            Send % "" sKeyName " Up"       ; send key up event for each key and
            aKeysToFreeze[sKeyName] := false ; set the each key's frozen state to false
        
     else 
        For sKeyName, isKeyFrozen in aKeysToFreeze
            If GetKeyState(sKeyName, "P")     ; If the key is physically pressed
                aKeysToFreeze[sKeyName] := true  ; set frozen state to true
    
    isFreezeOn := !isFreezeOn    ; Frozen mode toggle


*a::Send Blinda DownR
*LShift:: Send BlindLShift DownR

#If !aKeysToFreeze["a"] ; If the key is frozen, the key up hotkey is blocked
*a Up::Send Blinda Up

#If !aKeysToFreeze["LShift"]
*LShift Up::Send BlindLShift Up
#If

【讨论】:

这样,如果我按下左移键,它将一直保持按下状态,直到我再次按下左移键,对吧?这不是我想要的。我想我可以使用它,但我必须为我可能想要持有的每个键添加一行,并且我必须在持有和不单独持有之间切换它们。我一直在寻找可以使我按下特定指定键时已经握住的其他键保持保持状态的东西,直到我再次按下指定键为止,此时所有键都将停止保持(并且没有大量几乎相同的键)行)。 同意@0x464e,在我看来这不是一件“简单的事情”。您必须为每个特定键添加代码。每次循环遍历 every 键并检查它们的状态在我看来是个坏主意。如果有更好的方法来做你想做的事,我不知道。

以上是关于我想要一个简单的程序来在我按下一个键时冻结/解冻输入的主要内容,如果未能解决你的问题,请参考以下文章

单击按钮后,ImGui 冻结

在 Lwuit 中,如何处理键盘导航事件?

我需要能够暂停整个游戏,但是当我按下键盘上的 p 键时,只有我的汽车精灵暂停

当我按下键盘键时,Windows 可以播放声音吗?

当我在OpenGL中按下一个键时无法绘制形状

场景刷新冻结