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