Autohotkey: GetKeyState se rompe si se presiona una nueva tecla

Autohotkey: GetKeyState se rompe si se presiona una nueva tecla

Estoy intentando crear un script que presione el botón de espacio, siempre que esté presionado físicamente. Por ejemplo, si mantengo presionada la barra espaciadora, el script replicará espacios con Send. Tan pronto como suelto la barra espaciadora, deja de enviar espacio. Lo he logrado con este script.

#NoEnv
#SingleInstance Force
SendMode Input
loop {
    if (GetKeyState("Space"))
    {
        Send {Space down}
        Random, r, 5, 15
        Sleep, %r%
        Send {Space up}
    }
    Random, r, 5, 10
    Sleep, %r%
}
Esc::
ExitApp
return

Esto funciona, sin embargo, si presiono una nueva tecla mientras presiono el botón Espacio, devolverá GetKeyState("Space")falso por alguna razón. Actualmente, el script se inicia correctamente, pero presionar cualquier otra tecla es lo mismo que soltar la barra espaciadora, que no es lo que quiero.

Entonces pensé, tal vez Inputpueda ayudarme. Bueno, nuevamente funcionó, pero tan pronto como presioné una tecla diferente, se detuvo.

Esto es lo que probé y Inputque produjo los mismos resultados, relativamente (con compensaciones en el tiempo) que la primera muestra que probé.

#NoEnv
#SingleInstance Force
SendMode Input
loop {
    Input, OutputVar, B I L4 T0.05 V ; Had to keep it a low timeout due to the nature of the script
    if (InStr(OutputVar, Chr(32)))
    {
        Send {Space down}
        Random, r, 5, 15
        Sleep, %r%
        Send {Space up}
    }
    Random, r, 5, 10
    Sleep, %r%
}
Esc::
ExitApp
return

Esto también falla porque al presionar una nueva tecla internamente se libera la barra espaciadora.

Intentaría realizar eventos de combinación de teclas como Space::, pero también se activaría desde los Sendcomandos, creando un bucle infinito. Y no quisiera presionar ninguna otra tecla que no sea la barra espaciadora, ya que varias de mis teclas están vinculadas a algo u otro.

Se sienten como teclas de filtro o teclas adhesivas, porque incluso sin la tecla de acceso rápido automático, la barra espaciadora se libera después de presionar cualquier otra tecla. Pero ambas funciones están desactivadas. Y no es sólo la barra espaciadora. Cualquier tecla retenida se libera tan pronto como se presiona una nueva tecla. Las claves de filtro hacen exactamente lo que estoy tratando de evitar, pero no hay 'teclas de filtro inverso', por así decirlo. ¿Es posible arreglárselas con esta limitación de hardware? ¿Cómo puedo hacer que funcione la tecla de acceso rápido automático en el sentido de que veo que estoy manteniendo espacio, incluso después de presionar una nueva tecla?

Respuesta1

Esto es antiguo pero podría ayudar a personas con el mismo problema en el futuro.

En lugar de GetKeyState("Space")utilizar GetKeyState("Space", "P")para comprobar el estado físico de la clave.

Respuesta2

Cuando se presiona otra tecla después de la barra espaciadora, GetKeyState ya no captura la barra espaciadora. Es como cuando envías spam a "A" manteniéndolo presionado y luego presionas prolongadamente "B" sin soltar "A", no obtienes "aaaababab" sino solo "aaabbbbb". No entiendo lo que intentas hacer cuando presionas una tecla diferente mientras presionas la barra espaciadora (¿podría ser que quieras una combinación de spam?), pero creo que lo que estás tratando de lograr no es posible. .

información relacionada