He estado intentando iniciar automáticamente algunos scripts de Auto-HotKey usando el Programador de tareas, ya que permite que los scripts se ejecuten con privilegios de administrador sin un mensaje de UAC.
Normalmente, los scripts fallan después de varias horas. Cuando se ejecutan a través de la carpeta UAC/explorer.exe/startup, todos estos scripts se han ejecutado durante varios días. (El único que he visto que funciona de manera confiable a través del Programador de tareas es uno simple que muestra un cuadro de mensaje "Hola mundo").
Al usar Process Explorer, noté que los procesos secundarios de taskeng.exe siempre tenían sus conjuntos de trabajo reducidos en tamaño (de ~3000K a 512K aproximadamente), mientras que los procesos secundarios de UAC/explorer.exe permanecían constantes.
Intenté usar algún código AHK para ver si podía cambiar el tamaño del conjunto de trabajo:
pid := DllCall("GetCurrentProcessId")
handle := DllCall("OpenProcess", "UInt", 0x001F0FFF, "Int", 0, "Int", pid)
DllCall("SetProcessWorkingSetSize", "UInt", handle, "Int", 10000000, "Int", 20000000)
DllCall("CloseHandle", "Int", handle)
No pareció funcionar, así que no estoy seguro de si hay alguna solución al problema.
La solución fue compilar el ejecutable en 64 bits en lugar de 32 bits. No había probado esto anteriormente porque la versión de 32 bits funcionó perfectamente bien a través de la carpeta Inicio durante los meses que la usé.
Creo que el problema se debió a que el gancho del teclado se cargó en la memoria y luego se descargó durante la recolección de basura. Solo se vieron afectadas las teclas de acceso rápido asignadas al gancho del teclado, no las asignadas mediante RegisterHotkey.
He estado usando los ejecutables de 64 bits durante más de una semana y ninguno ha fallado, aunque algunos han tardado un poco en responder (podría tener algo que ver con procesos en segundo plano o con Chrome consumiendo recursos). Eliminar o reiniciar los procesos principal taskeng.exe y svchost podría solucionar este problema, ya que esa fue la única forma que encontré para detener la reasignación del conjunto de trabajo (todavía no solucionó el problema de 32 bits y eliminar el svchost principal creó algunos problemas nuevos). ).
[Actualización del 3 de octubre de 2018: Básicamente resolví el problema.] El Programador de tareas puede configurar tareas para que se ejecuten con diferentes prioridades, pero la interfaz de usuario no lo muestra.
Para cambiar la prioridad:
- Exporte la tarea como un archivo XML.
- Edite el archivo XML y cambie la etiqueta Prioridad. Veresta páginapara obtener una lista de prioridades.
- Establezca StopOnIdleEnd en "falso". (No lo he probado, pero podría haber causado un retraso en la entrada o el mouse).
- Importe el archivo XML modificado como una tarea y debería funcionar.
Aumentar la prioridad de esta manera también aumenta la memoria y la prioridad de E/S.
Es posible que aún sea necesario compilar scripts AHK como de 64 bits.