Welches Windows 7-Taskplanungsereignis würde auf eine Leerlauf-END-Bedingung reagieren?

8

Mit dem Windows 7-Taskplaner kann ich eine Aufgabe ausführen, wenn der Computer inaktiv ist. Es scheint jedoch keine offensichtliche Möglichkeit zu geben, eine Aufgabe auszuführen, wenn der Computer nicht mehr inaktiv ist oder nicht mehr inaktiv ist.

Sicherlich wird in Windows ein Ereignis ausgelöst (ein Ereignisprotokoll?), Wenn der Computer nicht mehr inaktiv ist. Oder eine Möglichkeit, die Tatsache zu erfassen, dass der Computer nicht mehr inaktiv ist, und darauf mit einer geplanten Aufgabe zu reagieren?

Wie würde ich das machen?

Oder gibt es im schlimmsten Fall irgendwo ein Befehlszeilenprogramm, das Befehle oder Ereignisse aufrufen kann, wenn der Computer in den Leerlaufstatus wechselt / diesen verlässt?

[UPDATE:] Der Ansatz in meiner Antwort an Diogo Rocha funktioniert. Ich habe aus diesem Skript eine über py2exe ausführbare Nulldatei 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 eine geplante Aufgabe in Windows ein, für die dies der exportierte HTML-Code 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 ließ meinen Computer für 15 Minuten im Leerlauf. Der Task-Manager zeigte an, dass die ausführbare Datei null ausgeführt wurde. Sobald ich die Maus bewegte, war der Computer nicht mehr inaktiv, und die ausführbare Nulldatei verschwand aus der Aufgabenliste.

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) Überprüfen Sie, ob die Null-Exe ausgeführt wird. Wenn es ausgeführt wird, wird die Umgebungsvariable% ERRORLEVEL% auf 0 gesetzt, da pslist fehlerfrei ausgeführt wurde. Wenn diese Umgebungsvariable 1 ist, wurde sie mit einem Fehler ausgeführt (die ausführbare Datei wurde nicht ausgeführt). Ich nutze diese Umgebungsvariable in einem Batch-Skript, um eine andere Aufgabe auszuführen, wenn der Computer nicht inaktiv ist.

r_alex_hall
quelle
Wie definieren Sie den Ruhezustand von Windows 7?
Der Hochstapler
Ich wünschte, ich wüsste es. Ich habe Wege gesehen, das angeblich zu hacken; Die beste Antwort, die ich gefunden (und getestet) habe, ist, dass der Ruhezustand mit 15 Minuten ohne Benutzeraktivität (Eingabe von Tastatur oder Maus usw.) und geringer CPU-Auslastung ausgelöst zu werden scheint.
r_alex_hall
Nur zu Ihrer Information, ich denke, ich fand dieses Windows-Ereignis sehr flockig (es reagierte nicht immer auf wieder aufgenommene Benutzeraktivitäten), und die Ziele, die ich mit der Frage erreichen wollte, wurden mit AutoHotkey in einem Programm I weitaus besser erreicht entwickelt: github.com/r-alex-hall/farmComm
r_alex_hall

Antworten:

4

Ich denke nicht, dass es möglich ist, Methoden zu implementieren, um einen Trigger "Border" bei Leerlaufereignissen zu erkennen (Eingabe oder Beendigung des Leerlaufstatus). Es gibt jedoch einen Befehl, der Ihr Windows dazu zwingt, in den Leerlaufstatus einzutreten und im Leerlauf ausgelöste Aufgaben auszuführen ::

Rundll32.exe advapi32.dll,ProcessIdleTasks

Sie können ein anderes Ereignis (aus dem Ereignisprotokoll) kombinieren, um diesen Befehl auszuführen, der wiederum eine andere Aufgabe auslöst, die im Ruhezustand ausgeführt werden muss. Soweit Sie wissen, können Sie beliebige Aufgaben frei kombinieren.

Diogo
quelle
1
Hmm. . . das bringt mich zum Nachdenken. . . Ich könnte es so angehen, ohne Rundll32.exe. Ich könnte die geplante TaskA so einrichten, dass ProgA im Leerlauf des Computers ausgeführt wird - und dann eine TaskB einrichten, auf der batchB.bat einmal pro Minute ausgeführt wird. BatchB.bat würde Pslist verwenden, um zu überprüfen, ob ProgA ausgeführt wird (und wenn dies nicht der Fall ist, führen Sie ProgB aus). Das allein würde nicht funktionieren, da ProgA auch dann weiterlaufen würde, wenn der Computer im Leerlauf bleibt. . . ABER . . . (Ich habe es gerade bemerkt!) Es gibt eine Taskplaner-Bedingung für "Stopp [des Programms], wenn der Computer nicht mehr inaktiv ist". Wenn dies die Ausführung von ProgA beendet, würde batchB.bat ProgB ausführen!
r_alex_hall