Qual evento do agendador de tarefas do Windows 7 responderia a uma condição END ociosa?

Qual evento do agendador de tarefas do Windows 7 responderia a uma condição END ociosa?

O agendador de tarefas do Windows 7 permite executar uma tarefa quando o computador fica ocioso, mas não parece haver nenhuma maneira óbvia de executar uma tarefa quando o computador sai do modo inativo 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 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 um programa de linha de comando em algum lugar que possa invocar comandos ou eventos quando o computador entra/sai do status inativo?

[ATUALIZAÇÃO:] A abordagem da minha resposta a Diogo Rocha funciona. 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 o executável nulo em execução. Assim que movi o mouse, o computador saiu do modo inativo 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 pslist (com uma opção -accepteula para que nos computadores em que está implantado ele 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 lote para executar outra tarefa se o computador estivernãoparado.

Responder1

Não creio que seja possível implementar nenhum método para detectar uma "fronteira" de gatilho em eventos inativos (entrar ou sair do estado inativo), no entanto, existe um comando que força o Windows a entrar no estado inativo e executar tarefas acionadas inativas :

Rundll32.exe advapi32.dll,ProcessIdleTasks

Você pode combinar outro evento (do log de eventos) para executar este comando que, por sua vez, aciona outra tarefa que deve ser executada no estado inativo. Pelo que você sabe, pode combinar livremente qualquer tarefa que desejar.

informação relacionada