Jakie zdarzenie harmonogramu zadań systemu Windows 7 zareaguje na stan bezczynności END?

8

Harmonogram zadań systemu Windows 7 pozwala mi uruchamiać zadanie, gdy komputer jest bezczynny, ale wydaje się, że nie ma oczywistego sposobu uruchomienia zadania, gdy komputer wznawia pracę bezczynnie lub nie jest już bezczynny.

Czy na pewno jakieś zdarzenie jest uruchamiane w systemie Windows (dziennik zdarzeń?), Gdy komputer nie jest już bezczynny? A może w jakiś sposób uchwycić fakt, że komputer nie jest już bezczynny i odpowiedzieć na to zaplanowanym zadaniem?

Jak mam to zrobić?

Lub, w najgorszym przypadku, istnieje program wiersza polecenia, który może wywoływać polecenia lub zdarzenia, gdy komputer wchodzi / wychodzi ze stanu bezczynności?

[AKTUALIZACJA:] Podejście z mojej odpowiedzi do Diogo Rocha działa. Z tego skryptu utworzyłem zerowy plik wykonywalny za pośrednictwem py2exe:

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()

- i skonfiguruj zaplanowane zadanie w systemie Windows, dla którego jest to eksportowany HTML:

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

I pozostawiłem komputer bezczynny przez 15 minut. Menedżer zadań pokazał, że działa plik wykonywalny o wartości NULL. Gdy tylko przesunąłem mysz, komputer wyłączył się z bezczynności, a plik wykonywalny o wartości null zniknął z listy zadań.

Odtąd jest kwestia skonfigurowania zadania (lub programu - co robię z Pythonem i py2exe), które używa pslist (z przełącznikiem -accepteula, aby na komputerach, na których jest zainstalowany, faktycznie uruchomił program) sprawdź, czy exe zerowy jest uruchomiony. Jeśli jest uruchomiony, zmienna środowiskowa% ERRORLEVEL% jest ustawiona na 0, ponieważ pslist działa bezbłędnie. Jeśli ta zmienna środowiskowa ma wartość 1, działała z błędem (nie znalazła uruchomionego pliku wykonywalnego). Korzystam z tej zmiennej środowiskowej w skrypcie wsadowym, aby uruchomić inne zadanie, jeśli komputer nie jest bezczynny.

r_alex_hall
źródło
Jak zdefiniować stan bezczynności systemu Windows 7?
Der Hochstapler
Chciałbym wiedzieć. Widziałem sposoby rzekomo zhakowania tego; najlepszą odpowiedzią, jaką znalazłem (i przetestowałem), jest to, że stan bezczynności wydaje się być wyzwalany przy 15 minutach braku aktywności użytkownika (klawiatura lub mysz itp.) i małym zużyciu procesora.
r_alex_hall
Po prostu FYI, myślę, że uważam, że to zdarzenie systemu Windows było bardzo niestabilne (nie zawsze reagowało na wznowioną aktywność użytkownika), a cele, które starałem się osiągnąć za pomocą pytania, były znacznie lepiej osiągnięte za pomocą AutoHotkey, w programie I opracowano: github.com/r-alex-hall/farmComm
r_alex_hall

Odpowiedzi:

4

Nie sądzę, aby możliwe było zaimplementowanie jakichkolwiek metod wykrywania „granicy” wyzwalacza w stanie bezczynności (wejście lub wyjście ze stanu bezczynności), jednak istnieje polecenie, które zmusza system Windows do przejścia w stan bezczynności i uruchamiania zadań wyzwalanych bezczynnie :

Rundll32.exe advapi32.dll,ProcessIdleTasks

Możesz połączyć inne zdarzenie (z dziennika zdarzeń), aby uruchomić to polecenie, które z kolei wyzwala inne zadanie, które należy uruchomić w stanie bezczynności. O ile wiesz, możesz dowolnie łączyć dowolne zadania.

Diogo
źródło
1
Hmm . . to prowadzi mnie do myślenia. . . Mogę podejść do tego w ten sposób, bez Rundll32.exe. Mógłbym skonfigurować zaplanowane zadanie A, aby uruchamiało ProgA na bezczynnym komputerze - a następnie skonfigurować TaskB, który uruchamia batchB.bat raz na minutę. BatchB.bat użyłby Pslist do sprawdzenia, czy ProgA jest uruchomiony (a jeśli nie, uruchom ProgB). To samo w sobie nie zadziałałoby, ponieważ ProgA działałby nadal, nawet jeśli komputer pozostanie bezczynny. . . ALE . . . (Właśnie zdałem sobie sprawę!) Istnieje warunek harmonogramu zadań: „Zatrzymaj [program], jeśli komputer przestanie być bezczynny”. Jeśli to zabije wykonanie ProgA, wtedy batchB.bat uruchomi ProgB!
r_alex_hall