Ejecutar un codigo al pulsar una tecla y parar al volver a pulsar

Esta sección es para preguntas sobre programación/scripting usando AutoHotkey.

Moderator: Flipeador

Nucleorion
Posts: 50
Joined: 11 Dec 2016, 11:33

Ejecutar un codigo al pulsar una tecla y parar al volver a pulsar

26 Dec 2022, 06:48

Hola, tengo este codigo para ejecutar unos saltos y un cuerpo a tierra al pulsar una tecla y que pare al volverla a pulsar. No funciona y no veo por que?

Code: Select all

^f::
Loop
{
	if GetKeyState("LControl", "P")
	break
	Send {Space}
	Sleep 1000
	Send {Space}
	Sleep 1000
	Send {x}
	Sleep 1500
}
return
sofista
Posts: 650
Joined: 24 Feb 2020, 13:59
Location: Buenos Aires

Re: Ejecutar un codigo al pulsar una tecla y parar al volver a pulsar

26 Dec 2022, 17:08

Tu script a mí me funcionó tanto en MS Notepad como en Notepad++, con los siguientes cambios:

—Eliminé el comando break.
—Para que un condicional —o en general, toda estructura o bucle de control— afecte a más de una línea de código, éstas deben estar comprendidas entre llaves.
—Eliminé las llaves en Send {w}, ya que se trata de enviar un literal, no un término reservado.
—Agregué Esc::ExitApp para salir del script.

En síntesis, el script quedaría así:

Code: Select all

^f::
Loop {
	if GetKeyState("LControl", "P") {
		Send {Space}
		Sleep 1000
		Send {Space}
		Sleep 1000
		Send x
		Sleep 1500
	}
}
return

Esc::ExitApp
Nucleorion
Posts: 50
Joined: 11 Dec 2016, 11:33

Re: Ejecutar un codigo al pulsar una tecla y parar al volver a pulsar

27 Dec 2022, 10:51

Muchas gracias Sofista! Y gracias por explicar el porque de cada corrección

Lo que quiero conseguir es que al pulsar control+f se quede haciendo el loop continuamente hasta que pulse de nuevo control o control+f

Yo tenia este codigo

Code: Select all

;;;;;;;;;;;;;; Para Mantener pulsada una tecla ;;;;;;;;;;;;;;;;;;;;;;
;Se mentiene pulsada la F pulsando control + G hasta que se pulsa la F para parar
^g::
Loop
{
	if GetKeyState("f", "P")
	break
	Send, {f down}
	Sleep 50
}
Entonces parti de ahí para esta nueva facultad. Entiendo que deberia meter de nuevo el break y quitar las llaves del if, ya que cuando se cumpla la condición lo que busco es salir del loop. Pero lo que me funcionó para mantener la f pulsada no me funciona para hacer una secuencia de send y sleep
Nucleorion
Posts: 50
Joined: 11 Dec 2016, 11:33

Re: Ejecutar un codigo al pulsar una tecla y parar al volver a pulsar

28 Dec 2022, 13:26

Tambien estoy probando con este codigo

Code: Select all

global Togglescum := 0
^f::
    Togglescum := !Togglescum
    while Togglescum
    {
		Send {Space}
		Sleep 1000
		Send {Space}
		Sleep 1000
		Send x
		Sleep 1500
		Send x
		Sleep 1500
	}
}
Pero me dice que la variable no tiene asignado un valor, luego se ejecuta pero no puedo evitar que salga el aviso ese. Ademas luego no se para cuando vuelvo a pulsar control+f
sofista
Posts: 650
Joined: 24 Feb 2020, 13:59
Location: Buenos Aires

Re: Ejecutar un codigo al pulsar una tecla y parar al volver a pulsar

28 Dec 2022, 18:14

Sí, es mucho mejor usar un toggle en vez del loop. Te iba a recomendar este enfoque, pero asuntos del mundo real me tenían ocupado. Disculpá la demora.

La variable Togglescum no necesita ser declarada global de forma explícita —ya lo es, porque la declaraste fuera de una función—, así que se elimina la declaración. Por otra parte, el script no se detiene porque la versión estándar de AutoHotkey no es multithread, de modo que el ciclo while nunca se entera del segundo ^f, está totalmente ocupado recorriendo el bloque una y otra vez. Este problema se soluciona agregando un segundo thread, hecho con la directiva que encabeza el script.

Ah, y no te olvides de cerrar el Hotkey con un return.

Probado en MS Notepad.

Code: Select all

#MaxThreadsPerHotkey 2
Togglescum := 0
^f::
	Togglescum := !Togglescum
	while Togglescum {
		Send {Space}
		Sleep 1000
		Send {Space}
		Sleep 1000
		Send x
		Sleep 1500
		Send x
		Sleep 1500
	}
return
Nucleorion
Posts: 50
Joined: 11 Dec 2016, 11:33

Re: Ejecutar un codigo al pulsar una tecla y parar al volver a pulsar

29 Dec 2022, 06:07

No te preocupes por la demora, encantado de recibir tu ayuda, cuando buenamente puedas ;)

Tengo mucho mas codigo creado, el #MaxThreadsPerHotkey 2 lo pongo al principio del codigo, junto con el #SingleInstance force por ejemplo?

Y por otro lado me sigue saliendo la ventana avisando de que la variable no tiene un valor asignado

Image

Esto hace que se minimice el juego y es un problema
Nucleorion
Posts: 50
Joined: 11 Dec 2016, 11:33

Re: Ejecutar un codigo al pulsar una tecla y parar al volver a pulsar

29 Dec 2022, 10:05

Estaba usando la versión 1.1.29.1 actualice a la 1.1.31 y ya va, lo tengo asi

Code: Select all

;~ Togglescum = 0
^f::
	Togglescum := !Togglescum
	while Togglescum {
		Send {Space}
		Sleep 1000
		Send {Space}
		Sleep 1000
		Send x
		Sleep 1500
		Send x
		Sleep 1500
		if !Togglescum {
            break
        }
	}
return
Muchisimas gracias Sofista :D
sofista
Posts: 650
Joined: 24 Feb 2020, 13:59
Location: Buenos Aires

Re: Ejecutar un codigo al pulsar una tecla y parar al volver a pulsar

30 Dec 2022, 09:59

Me alegro de que el código esté funcionando como querías :)

Respondiendo a una pregunta anterior, sí, efectivamente, la directiva #MaxThreadsPerHotkey 2 tiene que estar puesta al principio del script, en la sección de autocontinuación.

Buen año!

Return to “Pedir Ayuda”

Who is online

Users browsing this forum: No registered users and 17 guests