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.
la source
Réponses:
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 :
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.
la source