O agendador de tarefas do Windows 7 permite que eu execute uma tarefa quando o computador fica inativo, mas parece não haver nenhuma maneira óbvia de executar uma tarefa quando o computador retoma a inatividade ou não está mais inativo.
Certamente há algum evento acionado no Windows (um log de eventos?) quando o computador não está mais ocioso? Ou alguma forma 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 algum programa de linha de comando em algum lugar que possa invocar 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 null via py2exe fora 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. Gerenciador de tarefas mostrou o executável nulo em execução. Assim que eu movi o mouse, ele desligou o computador e o executável null desapareceu da lista de tarefas.
A partir daqui, é uma questão de configurar uma tarefa (ou programa - que eu estou fazendo com Python e py2exe) que usa pslist (com uma opção -accepteula para que em computadores ele seja implementado na verdade programa) para verificar se o exe nulo está em execução. Se estiver em execução, a variável de ambiente% ERRORLEVEL% será configurada como 0 porque o pslist foi executado sem erro. Se essa variável de ambiente for 1, ela será executada com um erro (não encontrou o executável em execução). Estou explorando essa variável de ambiente em um script em lote para executar outra tarefa se o computador não estiver ocioso.