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 := "AUTOCLOSE_KOFXIII".
#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
}
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 [url=https://docs.microsoft.com/en-us/windows/desktop/api/shellapi/nf-shellapi-shell_notifyicona]Shell_NotifyIcon[/url] 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 [c]ALT+F4[/c] cierra la ventana del juego, puedes utilizar este script que te pongo a continuación. Antes de ejecutarlo, debes reemplazar [c]TITLE[/c] por el nombre de la ventana del juego.
[code=autohotkey file=Untitled.ahk]#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[/code]
Otra forma:
[code=autohotkey file=Untitled.ahk]#SingleInstance Ignore
Run loader.exe
Return
LAlt & F4::
Hwnd := WinExist("A")
WinClose % "ahk_id" . Hwnd
WinWaitClose % "ahk_id" . Hwnd,, 3
SendInput {Escape}
ExitApp[/code]
[hr][/hr]
[quote]ApplicationName=AUTOCLOSE_KOFXIII [i][color=#008040]; Nombre de la aplicación[/color][/i][/quote]
Te recomiendo utilizar [c]:=[/c] en lugar de [c]=[/c] para asignar datos a tus variables, [c]=[/c] es para comparar, por ejemplo [c]if (var1 = var2)[/c] (utiliza siempre paréntesis con [c]if[/c]). Por ejemplo: [c]ApplicationName [color=#FF0000]:=[/color] [color=#BF8040][i]"AUTOCLOSE_KOFXIII"[/i][/color][/c].
[quote]#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[/quote]
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 [c]Off[/c], le indicas a AHK que permite ejecutar el mismo script varias veces. Si especificas [c]Force[/c], 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 [c]Ignore[/c], 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).
[quote]#Persistent ; Mismo caso con ésta linea, ni idea de para qué sirve o si estará de más.[/quote]
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 [c]#Persistent[/c], el script terminará automáticamente. Hay ciertas "cosas" que haces que [c]#Persistent[/c] se establezca automáticamente, como por ejemplo declarar una tecla de acceso rápido.
[quote]Return ; Ni idea de porqué va pero lo he visto en varios ejemplos[/quote]
[c]Return[/c] (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=autohotkey file=Untitled.ahk]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)[/code]
[c]Return[/c], o "retornar" como su nombre lo indica, en una función sirve para devolver un valor. Por ejemplo:
[code=autohotkey file=Untitled.ahk]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
}[/code]