Quel événement du planificateur de tâches Windows 7 répondrait à une condition END inactive?

8

Le planificateur de tâches de Windows 7 me permet d'exécuter une tâche lorsque l'ordinateur devient inactif, mais il ne semble pas y avoir de moyen évident d'exécuter une tâche lorsque l'ordinateur quitte l'inactivité ou n'est plus inactif.

Il y a sûrement un événement déclenché dans les fenêtres (un journal des événements?) Lorsque l'ordinateur n'est plus inactif? Ou un moyen de capturer le fait que l'ordinateur n'est plus inactif et d'y répondre avec une tâche planifiée?

Comment pourrais-je faire ça?

Ou, au pire, existe-t-il un programme de ligne de commande quelque part qui peut appeler des commandes ou des événements lorsque l'ordinateur entre / sort en mode veille?

[MISE À JOUR:] L'approche dans ma réponse à Diogo Rocha fonctionne. J'ai créé un exécutable nul via py2exe à partir de ce 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()

--et configurez une tâche planifiée dans Windows pour laquelle il s'agit du code HTML exporté:

<?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>

Et laissé mon ordinateur inactif pendant 15 minutes. Le gestionnaire de tâches a montré que l'exécutable nul était en cours d'exécution. Dès que j'ai déplacé la souris, l'ordinateur est devenu inactif et l'exécutable nul a disparu de la liste des tâches.

À partir d'ici, il s'agit de configurer une tâche (ou un programme - que je fais avec Python et py2exe) qui utilise pslist (avec un commutateur -accepteula pour que sur les ordinateurs sur lesquels il est déployé, il exécute réellement le programme) pour vérifiez si l'exe nul est en cours d'exécution. S'il est en cours d'exécution, la variable d'environnement% ERRORLEVEL% est définie sur 0 car pslist s'est exécuté sans erreur. Si cette variable d'environnement est 1, elle s'est exécutée avec une erreur (elle n'a pas trouvé l'exécutable en cours d'exécution). J'exploite cette variable d'environnement dans un script de commandes pour exécuter une autre tâche si l'ordinateur n'est pas inactif.

r_alex_hall
la source
Comment définissez-vous l' état d' inactivité de Windows 7?
Der Hochstapler
J'aimerais savoir. J'ai vu des moyens de prétendre pirater cela; la meilleure réponse que j'ai trouvée (et testée) est que l'état inactif semble être déclenché avec 15 minutes sans activité utilisateur (entrée clavier ou souris, etc.) et peu d'utilisation du processeur.
r_alex_hall
Juste pour info, je pense que j'ai trouvé cet événement Windows très instable (il ne répondait pas toujours à la reprise de l'activité des utilisateurs), et les objectifs que je cherchais à atteindre avec la question étaient bien mieux atteints via AutoHotkey, dans un programme que je développé: github.com/r-alex-hall/farmComm
r_alex_hall

Réponses:

4

Je ne pense pas qu'il soit possible d'implémenter des méthodes pour détecter une "frontière" de déclenchement sur des événements inactifs (entrer ou sortir de l'état inactif), mais il existe une commande qui force votre Windows à entrer en état inactif et à exécuter des tâches déclenchées inactives :

Rundll32.exe advapi32.dll,ProcessIdleTasks

Vous pouvez combiner un autre événement (à partir du journal des événements) pour exécuter cette commande qui à son tour déclenche une autre tâche qui doit être exécutée à l'état inactif. Autant que vous sachiez, vous pouvez combiner librement toutes les tâches que vous souhaitez.

Diogo
la source
1
Hmm. . . cela me fait réfléchir. . . Je pourrais l'approcher de cette façon, sans Rundll32.exe. Je pourrais configurer taskA planifié pour exécuter ProgA sur l'ordinateur inactif - puis configurer un TaskB, qui exécute batchB.bat une fois par minute. BatchB.bat utiliserait Pslist pour vérifier si ProgA est en cours d'exécution (et si ce n'est pas le cas, exécutez ProgB). Cela ne fonctionnerait pas en soi car ProgA continuerait de fonctionner même si l'ordinateur restait inactif. . . MAIS . . . (Je viens de réaliser!) Il y a une condition du planificateur de tâches pour "Arrêter [le programme] si l'ordinateur cesse d'être inactif". Si cela tue l'exécution de ProgA, alors batchB.bat exécuterait ProgB!
r_alex_hall