O agendador de tarefas do Windows 7 permite que eu execute uma tarefa quando o computador fica ocioso, mas não parece haver uma maneira óbvia de executar uma tarefa quando o computador sai da ociosidade ou não está mais ocioso.
Certamente, há algum evento acionado no Windows (um log de eventos?) Quando o computador não está mais ocioso? Ou alguma maneira de capturar o fato de que o computador não está mais ocioso e responder a isso com uma tarefa agendada?
Como eu faria isso?
Ou, na pior das hipóteses, existe um programa de linha de comando em algum lugar que pode chamar comandos ou eventos quando o computador entra / sai do status ocioso?
[ATUALIZAÇÃO:] A abordagem na minha resposta a Diogo Rocha funciona. Eu criei um executável nulo via py2exe a partir deste 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()
--e configure uma tarefa agendada no Windows para a qual este é o 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>
E deixei meu computador ocioso por 15 minutos. O gerenciador de tarefas mostrou a execução executável nula. Assim que movi o mouse, o computador ficou ocioso e o executável nulo desapareceu da lista de tarefas.
A partir daqui, é uma questão de configurar uma tarefa (ou programa - o que estou fazendo com Python e py2exe) que usa o pslist (com uma opção -accepteula para que nos computadores em que ele é implantado realmente execute o programa) para verifique se o exe nulo está em execução. Se estiver em execução, a variável de ambiente% ERRORLEVEL% será definida como 0 porque o pslist foi executado sem erros. Se essa variável de ambiente for 1, ela foi executada com um erro (não encontrou o executável em execução). Estou explorando essa variável de ambiente em um script em lotes para executar outra tarefa se o computador não estiver ocioso.