¿Qué evento del planificador de tareas de Windows 7 respondería a una condición inactiva de FIN?

8

El programador de tareas de Windows 7 me permite ejecutar una tarea cuando la computadora está 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 hay algún evento activado 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, ¿hay un programa de línea de comandos en algún lugar que pueda invocar comandos o eventos cuando la computadora entra / sale del estado inactivo?

[ACTUALIZACIÓN:] El enfoque en 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 configure 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 en ejecución. Tan pronto como moví el mouse, saqué la computadora del modo inactivo y el ejecutable nulo desapareció de la lista de tareas.

A partir de aquí, se trata de configurar una tarea (o programa, lo que estoy haciendo con Python y py2exe) que usa pslist (con un interruptor -accepteula para que en las computadoras que se implementan realmente ejecute el programa) para compruebe si se está ejecutando el exe nulo. Si se está ejecutando, la variable de entorno% ERRORLEVEL% se establece en 0 porque pslist se ejecutó sin error. 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 no está inactiva.

r_alex_hall
fuente
¿Cómo define el estado inactivo de Windows 7?
Der Hochstapler
Ojala lo supiera. He visto formas de supuestamente hackear eso; La mejor respuesta que he encontrado (y probado) es que el estado inactivo parece activarse con 15 minutos sin actividad del usuario (entrada de teclado o mouse, etc.) y poco uso de CPU.
r_alex_hall
Solo para su información, creo que este evento de Windows me pareció muy inestable (no siempre respondía a la reanudación de la actividad del usuario), y los objetivos que buscaba lograr con la pregunta se lograron mucho mejor mediante AutoHotkey, en un programa que desarrollado: github.com/r-alex-hall/farmComm
r_alex_hall

Respuestas:

4

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 su Windows a ingresar en estado inactivo y ejecutar tareas desencadenadas inactivas :

Rundll32.exe advapi32.dll,ProcessIdleTasks

Puede combinar otro evento (desde el registro de eventos) para ejecutar este comando que a su vez desencadenará otra tarea que debe ejecutarse en estado inactivo. Hasta donde usted sabe, puede combinar libremente cualquier tarea que desee.

Diogo
fuente
1
Hmm . . eso me lleva a pensar. . . Podría abordarlo de esa manera, sin Rundll32.exe. Podría configurar la tarea programada A para ejecutar ProgA en la computadora inactiva, y luego configurar una TareaB, que ejecuta batchB.bat una vez por minuto. BatchB.bat usaría Pslist para verificar si ProgA se está ejecutando (y si no es así, ejecute ProgB). Eso por sí solo no funcionaría porque ProgA continuaría ejecutándose incluso si la computadora se deja inactiva. . . PERO . . . (¡Acabo de darme cuenta!) Hay una condición de programador de tareas para "Detener [el programa] si la computadora deja de estar inactiva". Si eso mata la ejecución de ProgA, entonces batchB.bat ejecutaría ProgB!
r_alex_hall