Mit dem Aufgabenplaner von Windows 7 kann ich eine Aufgabe ausführen, wenn der Computer in den Leerlauf geht, es scheint jedoch keine offensichtliche Möglichkeit zu geben, eine Aufgabe auszuführen, wenn der Computer aus dem Leerlauf fortgesetzt wird oder sich nicht mehr im Leerlauf befindet.
Es gibt doch sicher ein Ereignis, das in Windows ausgelöst wird (ein Ereignisprotokoll?), wenn der Computer nicht mehr im Leerlauf ist? Oder eine Möglichkeit, die Tatsache zu erfassen, dass der Computer nicht mehr im Leerlauf ist, und darauf mit einer geplanten Aufgabe zu reagieren?
Wie würde ich das machen?
Oder gibt es schlimmstenfalls irgendwo ein Befehlszeilenprogramm, das Befehle oder Ereignisse aufrufen kann, wenn der Computer in den Leerlaufzustand wechselt bzw. diesen verlässt?
[UPDATE:] Der Ansatz in meiner Antwort an Diogo Rocha funktioniert. Ich habe aus diesem Skript über py2exe eine Null-ausführbare Datei erstellt:
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()
-- und richten Sie in Windows eine geplante Aufgabe ein, für die dies das exportierte HTML ist:
<?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>
Und ich habe meinen Computer 15 Minuten lang im Leerlauf gelassen. Der Task-Manager zeigte an, dass die ausführbare Nulldatei ausgeführt wurde. Sobald ich die Maus bewegte, wurde der Computer aus dem Leerlauf geholt und die ausführbare Nulldatei verschwand aus der Taskliste.
Von hier aus geht es darum, eine Aufgabe (oder ein Programm – was ich mit Python und py2exe mache) einzurichten, die pslist verwendet (mit einem -accepteula-Schalter, damit auf Computern, auf denen es bereitgestellt wird, das Programm tatsächlich ausgeführt wird), um zu prüfen, ob die Null-EXE ausgeführt wird. Wenn sie ausgeführt wird, wird die Umgebungsvariable %ERRORLEVEL% auf 0 gesetzt, da pslist ohne Fehler ausgeführt wurde. Wenn diese Umgebungsvariable 1 ist, wurde sie mit einem Fehler ausgeführt (sie hat die ausführbare Datei nicht gefunden). Ich nutze diese Umgebungsvariable in einem Batch-Skript, um eine andere Aufgabe auszuführen, wenn der ComputernichtLeerlauf.
Antwort1
Ich glaube nicht, dass es möglich ist, Methoden zum Erkennen einer Trigger-„Grenze“ bei Leerlaufereignissen (Eintreten oder Verlassen des Leerlaufzustands) zu implementieren. Es gibt jedoch einen Befehl, der Ihr Windows dazu zwingt, in den Leerlaufzustand zu wechseln und durch Leerlauf ausgelöste Aufgaben auszuführen:
Rundll32.exe advapi32.dll,ProcessIdleTasks
Sie könnten ein anderes Ereignis (aus dem Ereignisprotokoll) kombinieren, um diesen Befehl auszuführen, der wiederum eine andere Aufgabe auslöst, die im Leerlauf ausgeführt werden muss. Soweit Sie wissen, können Sie alle gewünschten Aufgaben frei kombinieren.