autohotkey - Quiero un programa simple para congelar/descongelar la entrada cuando presiono una tecla

CorePress2024-01-25  8

Esto parece algo muy simple, pero no puedo encontrarlo por ningún lado. Quiero un programa simple (como AutoHotkey, pero no puedo encontrar una manera de hacerlo con AutoHotkey) que congele mi teclado y mi mouse (lo que sea que esté presionando en ese momento sigue siendo presionado, incluso si suelto la tecla real). /botón) cuando presiono una determinada tecla, y la mantengo congelada hasta que presiono esa tecla nuevamente (y otros programas nunca considerarán que la tecla elegida fue presionada).

Solo quiero esto para que, si un juego requiere que mantenga presionados algunos botones, pueda presionar los botones, presionar la tecla designada, soltarla y luego presionar la tecla nuevamente cuando se supone que debo soltar los botones.

2

No creo que esto sea realmente "algo tan simple". Hay muchas formas diferentes de lograr esto y las diferentes formas funcionarían de manera diferente. También es algo a considerar la forma exacta que necesitarás para tu juego. Necesitaría saber cómo procesa tu juego la entrada. Si fuera una entrada sin procesar/directa, requeriría que busques una solución aún más avanzada.

-0x464e

28/03/2021 a las 16:49

@0x464e Bueno, hice un script AutoHotkey que realiza entradas predefinidas y funcionó como se esperaba. Si hubiera una manera de hacer que AutoHotkey hiciera lo que estoy buscando, entonces funcionaría para el juego que me preocupa actualmente, y si no funcionara con algo más más adelante, Podría preocuparme por eso entonces.

-davidhsonic

29 de marzo de 2021 a las 0:26



------------------------------------

Esto funciona en editores de texto. Aunque no estoy seguro de cómo funcionará en los juegos.

#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 

Actualización: nuevamente, probar esto en juegos tendrás que hacerlo tú mismo.

#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 {Blind}{a DownR}
*LShift:: Send {Blind}{LShift DownR}

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

#If !aKeysToFreeze["LShift"]
*LShift Up::Send {Blind}{LShift Up}
#If

2

Así que si presiono Mayús a la izquierda, permanecerá presionado hasta que presione Mayús a la izquierda nuevamente, ¿verdad? Eso no es exactamente lo que estaba buscando. Supongo que podría usar esto, pero tendría que agregar una línea para cada tecla que posiblemente quisiera mantener presionada, y tendría que cambiarlas entre mantenidas y no mantenidas individualmente. Estaba buscando algo que hiciera que las otras teclas que ya tenía presionadas cuando presioné la tecla designada específica permanecieran presionadas hasta que presionara la tecla designada nuevamente, momento en el cual todas las teclas dejarían de mantenerse presionadas (y sin una tonelada de teclas casi idénticas).líneas).

-davidhsonic

4 de abril de 2021 a las 20:18

De acuerdo con @0x464e, esto no me parece una "cosa sencilla". Tendrás que agregar código para cada clave específica. Recorrer cada clave cada vez y comprobar su estado me parece una mala idea. Si hay una manera mejor de hacer lo que quieres, no la conozco.

-Eli

4 de abril de 2021 a las 22:43



------------------------------------

¿Qué pasa con esto?

; Start Notepad
If !WinExist("ahk_class Notepad")
    Run Notepad
WinWait, ahk_class Notepad
WinActivate

; Send a key to Notepad every 3 seconds, if Notepad is active

Loop
{
    WinWaitActive, ahk_class Notepad
    SendInput, a
    Sleep, 3000
}

; Press F1 to freeze keyboard and mouse
; the script continues sending the key

F1::
    BlockInput On
    UnBlock := true ; assign the boolean value "true" to this variable
return

; Press F2 to unfreeze keyboard and mouse

#If UnBlock  ; if this variable has the value "true"

    F2::
        UnBlock := false
        BlockInput Off
    return

#If

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare