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

8

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.

r_alex_hall
fonte
Como você define o estado ocioso do Windows 7?
Der Hochstapler
Gostaria de saber. Eu já vi maneiras de supostamente invadir isso; a melhor resposta que encontrei (e testei) é que o estado ocioso parece ser acionado com 15 minutos de nenhuma atividade do usuário (entrada de teclado ou mouse etc.) e pouco uso da CPU.
R_alex_hall
Apenas para sua informação, acho que achei esse evento do Windows muito esquisito (nem sempre respondia à retomada da atividade do usuário), e os objetivos que eu procurava alcançar com a pergunta eram muito melhores alcançados por meio do AutoHotkey, em um programa que eu desenvolvido: github.com/r-alex-hall/farmComm
r_alex_hall

Respostas:

4

Eu não acho que seja possível implementar métodos para detectar uma "borda" de acionador 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 ativadas 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 ocioso. Até onde você sabe, você pode combinar livremente todas as tarefas que desejar.

Diogo
fonte
11
Hmm . . . isso me leva a pensar. . . Eu poderia abordar dessa maneira, sem o Rundll32.exe. Eu poderia configurar a tarefa agendada A para executar o ProgA no computador ocioso - e, em seguida, configurar um TaskB, que executa o batchB.bat uma vez por minuto. O BatchB.bat usaria o Pslist para verificar se o ProgA está sendo executado (e, se não estiver, execute o ProgB). Isso por si só não funcionaria porque o ProgA continuaria sendo executado, mesmo que o computador permanecesse ocioso. . . MAS . . . (Acabei de perceber!) Há uma condição do agendador de tarefas para "Interromper [o programa] se o computador parar de ficar ocioso". Se isso acabar com a execução do ProgA, o batchB.bat executará o ProgB!
precisa saber é o seguinte