solicitud de ayuda con un pequeño script

Esta sección es para preguntas sobre programación/scripting usando AutoHotkey.
diego87
Posts: 1
Joined: 07 Aug 2018, 11:48

solicitud de ayuda con un pequeño script

07 Aug 2018, 18:40

hola buenas, es mi primer mensaje en éste foro y creo que ya he leído bastante pero aún no logro dar con la solución por ende recurro a su ayuda (por si alguien sería tan amable de ayudarme) intentaré ser lo más claro posible.

estoy intentando cargar un juego a raíz de un front-end llamado mamewah , el juego en cuestión es "The King of fighters XIII" en su versión de arcade. Tanto el front-end como el juego (por separado) funcionan correctamente, el problema radica al intentar cerrar el juego (previamente cargado por el front-end) con el hotkey : alt + f4, paso a detallar más el caso:

1.- el front-end hace una llamada a un archivo ejecutable (.exe) el cual a su vez posee un código que básicamente arrastra un archivo hacia otro (" y lo deja caer" ) para así cargarlo y jugar respectivamente.
2.- dicho archivo .exe (el que arrastra) funciona perfectamente estando fuera del front-end y se logra cerrar con el atajo : alt f4.
3.- al cargar el juego desde el front-end si bien carga correctamente, luego al intentar presionar el atajo alt f4 el juego se cierra pero queda un proceso llamado : game.exe en ejecución el cual para poder terminarlo requiere de presionar la tecla "escape" .
4.- dicha tecla "escape" no forma parte del total de botones a utilizar en mi panel arcade. (tampoco es viable agregarlo porque no es la idea).
5.- estoy intentando desarrollar un código el cual básicamente hará lo siguiente:

a) cargar el juego (el .exe que arrastra un archivo hacia otro) con el fin de que efectivamente el juego se vea.
b) esperar a que el atajo "alt+f4" sea presionado.
c) esperar 3 segundos para que el juego sea cerrado correctamente (esto puede ser modificado en verdad)
d) presionar la tecla "escape"
e) esperar 1 segundo (sólo para asegurarse)
f) terminar el script de autohotkey.


con ello todo debería de funcionar correctamente (en teoría)... tengo sólo una duda con el tema de la parte "f" anteriormente explicado y es que en mis primeros intentos el script si bien terminaba y no figuraba en la lista de procesos SI aparecía en la parte inferior de la barra de herramientas de Windows donde al pasar con el cursor por encima se eliminaba automáticamente por ende no sé si será posible hacer algo que asegure que dicho proceso efectivamente sea terminado en un 100%.

el script que llevo escrito es el siguiente (espero esté bien):

Code: Select all

ApplicationName=AUTOCLOSE_KOFXIII ; Nombre de la aplicación
#SingleInstance,Force ; No tengo idea del cómo funciona ésto pero creo que es para "forzar" el cierre del proceso ... lo añadí sólo por curiosidad
#Persistent ; Mismo caso con ésta linea, ni idea de para qué sirve o si estará de más.
Run , loader.exe  ; Carga el archivo que arrastra un archivo hacia otro.
Keywait, !{F4} ; Supuestamente debería esperar a que se mantenga presionado "alt" y luego se presione "f4"
Sleep, 3000 ; Espera de 3 segundos
Send, {Escape} ; Presiona la tecla "escape" (?)
ExitApp ; Sale del script de autohotkey
Return ; Ni idea de porqué va pero lo he visto en varios ejemplos
El script de autohotkey irá en la misma ruta de donde están los archivos que cargan el juego por ende no añadí el tema así como una ruta tipo C:/algo/sistema/juego/ ...

Agradecido de cualquier tipo de ayuda, estaré pendiente a sus comentarios por si necesitaran más feedback del caso =)

Muchas gracias :wave:
User avatar
Flipeador
Posts: 1018
Joined: 15 Nov 2014, 21:31
GitHub: Flipeador
Location: Argentina
Contact:

Re: solicitud de ayuda con un pequeño script

07 Aug 2018, 22:38

Hola, ¿cual es tu problema exactamente?, según entiendo, el script que has escrito te funciona correctamente, pero al terminarlo (ExitApp), el icono no desaparece de la barra de tareas hasta que no pasas el cursor por encima, ¿es así?. Esto es muy raro, ya que al terminar el script AutoHotkey automáticamente quita el icono de la barra de tareas, a veces el icono queda debido a que el script no ha terminado correctamente, esto es así debido a que cuando una aplicación añade un icono al área de notificación (una aplicación puede añadir varios iconos) debe llamar a la función Shell_NotifyIcon indicándole al sistema que debe remover el icono de la barra de tareas, si una aplicación termina sin llamar a esta función, si bien el icono se elimina automáticamente por el sistema, el área de notificación no es informada sobre esto (remover el icono), por lo que lo sigue mostrando. Al pasar el cursor por encima, el sistema detecta automáticamente que el icono ya no existe y envía un mensaje al área de notificación para refrescar los iconos.
Como ya mencioné, esto no debe de ocurrir si el script termina correctamente.

Si la combinación de teclas ALT+F4 cierra la ventana del juego, puedes utilizar este script que te pongo a continuación. Antes de ejecutarlo, debes reemplazar TITLE por el nombre de la ventana del juego.

Code: Select all

#SingleInstance Ignore

; si no funciona, puedes pobrar reemplazando "Run" por "RunWait" y quitando los comandos "WinWait" y "WinWaitClose"
Run loader.exe

; aquí debes reemplazar "TITLE" por el nombre de la ventana del juego.
WinWait TITLE
WinWaitClose TITLE

SendInput {Escape}

ExitApp
Otra forma:

Code: Select all

#SingleInstance Ignore

Run loader.exe
Return

LAlt & F4::
Hwnd := WinExist("A")
WinClose % "ahk_id" . Hwnd
WinWaitClose % "ahk_id" . Hwnd,, 3
SendInput {Escape}
ExitApp

ApplicationName=AUTOCLOSE_KOFXIII ; Nombre de la aplicación
Te recomiendo utilizar := en lugar de = para asignar datos a tus variables, = es para comparar, por ejemplo if (var1 = var2) (utiliza siempre paréntesis con if). Por ejemplo: ApplicationName [color=#FF0000]:=[/color] [color=#BF8040][i]"AUTOCLOSE_KOFXIII"[/i][/color].
#SingleInstance,Force ; No tengo idea del cómo funciona ésto pero creo que es para "forzar" el cierre del proceso ... lo añadí sólo por curiosidad
Esa directiva sirve para indicarle a AutoHotkey el comportamiento a la hora de ejecutar el mismo script. Por defecto, si vuelves a ejecutar el mismo script (una instancia/proceso/script ya está ejecutándose) AHK te pregunta si deseas cerrar el script actualmente en ejecución y ejecutarlo de nuevo, o si deseas ignorar la nueva/segunda ejecución y no hacer nada. Si especificas Off, le indicas a AHK que permite ejecutar el mismo script varias veces. Si especificas Force, le indicas a AHK que cuando ejecutes el script y ya haya una instancia de éste en ejecución, cierre esta instancia y continúe con la nueva. Si especificas Ignore, cuando ejecutes el script y ya haya una instancia, AHK ignora esta nueva instancia (la cierra) y deja la vieja/anterior/primera (se ignoran los intentos de ejecutar un script que ya se está ejecutando).
#Persistent ; Mismo caso con ésta linea, ni idea de para qué sirve o si estará de más.
Esta directiva evita que el script termine automáticamente una vez terminada de procesar la sección de auto ejecución (parte superior del script). Por ejemplo, si estableces un temporizador (SetTimer) para que ejecute una parte de código durante X tiempo y no especificas #Persistent, el script terminará automáticamente. Hay ciertas "cosas" que haces que #Persistent se establezca automáticamente, como por ejemplo declarar una tecla de acceso rápido.
Return ; Ni idea de porqué va pero lo he visto en varios ejemplos
Return (retornar/volver/devolver) sirve para terminar la sub-rutina actual y volver a la anterior. Por ejemplo, el uso que tú le has dado en tu script, hace que, como no haya una sub-rutina anterior, el interpretador (AHK) pare (deje de seguir leyendo líneas) en ese punto.
Mira este ejemplo de una "sub-rutina":

Code: Select all

MsgBox zona de auto-ejecución (parte superior del script)
gosub sub_rutina_1
MsgBox continua zona de auto-ejecución
ExitApp    ; terminar instancia/proceso/script

sub_rutina_1:
MsgBox sub_rutina_1
gosub sub_rutina_2
MsgBox continua sub_rutina_1
return    ; devuelve a la rutina anterior (gosub sub_rutina_1)

sub_rutina_2:
MsgBox sub_rutina_2
return    ; devuelve a la rutina anteriro (sub_rutina_1)
Return, o "retornar" como su nombre lo indica, en una función sirve para devolver un valor. Por ejemplo:

Code: Select all

variable := mi_funcion()    ; almacena el resultado de mi_funcion en variable

MsgBox %variable%    ; muestra el resultado
MsgBox % variable    ; otra forma de mostrar el resultado

MsgBox % mi_funcion()    ; recupera la cadena que devuelve mi_funcion y la muestra sin almacenarla en ninguna variable
ExitApp    ; terminar

mi_funcion()
{
    return "Hola Mundo!"    ; devuelve la cadena entre comillas
}
Windws 1♂ Pro 64-Bits I make scripts for AHKv2 (my v2 compiler) & WIN_7+ Spanish Argentina SublimeText 3 & AHKv2 My GDI+ Library

Return to “Pedir Ayuda”

Who is online

Users browsing this forum: No registered users and 17 guests