El programador de tareas de Windows 7 me permite ejecutar una tarea cuando la computadora queda inactiva, pero no parece haber ninguna forma obvia de ejecutar una tarea cuando la computadora se reanuda desde inactiva o ya no está inactiva.
Seguramente se activa algún evento en Windows (¿un registro de eventos?) cuando la computadora ya no está inactiva. ¿O alguna forma de capturar el hecho de que la computadora ya no está inactiva y responder a eso con una tarea programada?
¿Cómo haría esto?
O, en el peor de los casos, ¿existe algún programa de línea de comandos en algún lugar que pueda invocar comandos o eventos cuando la computadora entra o sale del estado inactivo?
[ACTUALIZACIÓN:] El enfoque de mi respuesta a Diogo Rocha funciona. Creé un ejecutable nulo a través de py2exe a partir de este script:
import sys
import time
#restart a pause every twenty seconds, with two functions that call each other.
def call_pause():
pause()
def pause():
time.sleep(20)
call_pause()
call_pause()
--y configurar una tarea programada en Windows para la cual este es el HTML exportado:
<?xml version="1.0" encoding="UTF-16"?>
<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
<RegistrationInfo>
<Date>2012-04-27T17:40:46.8871631</Date>
<Author>GENIUS-BREATH-COMPY</Author>
<Description>This task runs ProgA when the computer enters an idle state, and terminates ProgA when the computer *leaves* an idle state. The is all for scheduled TaskB, which periodically runs a batch that tests whether ProgA is running. If ProgA is not running (because this task terminated it), ProgB runs (as the computer is NOT idle). If ProgA *is* running, TaskB's batch does not run ProgB.</Description>
</RegistrationInfo>
<Triggers>
<IdleTrigger>
<Enabled>true</Enabled>
</IdleTrigger>
</Triggers>
<Principals>
<Principal id="Author">
<UserId>S-1-5-18</UserId>
<RunLevel>HighestAvailable</RunLevel>
</Principal>
</Principals>
<Settings>
<MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
<DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries>
<StopIfGoingOnBatteries>true</StopIfGoingOnBatteries>
<AllowHardTerminate>true</AllowHardTerminate>
<StartWhenAvailable>true</StartWhenAvailable>
<RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
<IdleSettings>
<Duration>PT1M</Duration>
<WaitTimeout>PT0S</WaitTimeout>
<StopOnIdleEnd>true</StopOnIdleEnd>
<RestartOnIdle>true</RestartOnIdle>
</IdleSettings>
<AllowStartOnDemand>true</AllowStartOnDemand>
<Enabled>true</Enabled>
<Hidden>false</Hidden>
<RunOnlyIfIdle>true</RunOnlyIfIdle>
<WakeToRun>false</WakeToRun>
<ExecutionTimeLimit>PT0S</ExecutionTimeLimit>
<Priority>7</Priority>
<RestartOnFailure>
<Interval>PT1M</Interval>
<Count>3</Count>
</RestartOnFailure>
</Settings>
<Actions Context="Author">
<Exec>
<Command>C:\path_to\nullExecutable</Command>
</Exec>
</Actions>
</Task>
Y dejé mi computadora inactiva durante 15 minutos. El administrador de tareas mostró el ejecutable nulo ejecutándose. Tan pronto como moví el mouse, la computadora salió del estado de inactividad y el ejecutable nulo desapareció de la lista de tareas.
A partir de aquí, es cuestión de configurar una tarea (o programa, lo cual estoy haciendo con Python y py2exe) que use pslist (con un modificador -accepteula para que en las computadoras en las que se implemente realmente ejecute el programa) para compruebe si el exe nulo se está ejecutando. Si se está ejecutando, la variable de entorno %ERRORLEVEL% se establece en 0 porque pslist se ejecutó sin errores. Si esa variable de entorno es 1, se ejecutó con un error (no encontró el ejecutable ejecutándose). Estoy explotando esa variable de entorno en un script por lotes para ejecutar otra tarea si la computadora estánoinactivo.
Respuesta1
No creo que sea posible implementar ningún método para detectar un "borde" de activación en eventos inactivos (entrar o salir del estado inactivo), sin embargo, hay un comando que obliga a Windows a ingresar al estado inactivo y ejecutar tareas activadas inactivas. :
Rundll32.exe advapi32.dll,ProcessIdleTasks
Puede combinar otro evento (del registro de eventos) para ejecutar este comando, lo que a su vez desencadena otra tarea que debe ejecutarse en estado inactivo. Hasta donde sabes, puedes combinar libremente cualquier tarea que desees.