Page 1 of 1

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

Posted: 26 Dec 2022, 06:48
by Nucleorion
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

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

Posted: 26 Dec 2022, 17:08
by sofista
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

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

Posted: 27 Dec 2022, 10:51
by Nucleorion
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

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

Posted: 28 Dec 2022, 13:26
by Nucleorion
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

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

Posted: 28 Dec 2022, 18:14
by sofista
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

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

Posted: 29 Dec 2022, 06:07
by Nucleorion
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

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

Posted: 29 Dec 2022, 10:05
by Nucleorion
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

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

Posted: 30 Dec 2022, 09:59
by sofista
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!