どのようなWindows 7タスクスケジューライベントがアイドルEND条件に応答しますか?


8

Windows 7タスクスケジューラを使用すると、コンピューターがアイドル状態になったときにタスクを実行できますが、コンピューターがアイドル状態から再開したとき、またはアイドル状態でなくなったときにタスクを実行する明確な方法がないようです。

コンピューターがアイドル状態でなくなったときに、ウィンドウでトリガーされたイベント(イベントログ?)は確かにありますか?または、コンピュータがアイドル状態ではなくなったという事実をキャプチャし、スケジュールされたタスクでそれに応答する方法はありますか?

どうすればいいですか?

または、最悪の場合、コンピューターがアイドル状態に入る/終了するときにコマンドまたはイベントを呼び出すことができるコマンドラインプログラムはどこかにありますか?

[更新:] Diogo Rochaへの私の返信のアプローチが機能します。このスクリプトからpy2exeを介してnull実行可能ファイルを作成しました。

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

-これがエクスポートされたHTMLであるWindowsでスケジュールされたタスクを設定します。

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

コンピュータを15分間アイドル状態にしました。タスクマネージャーは、null実行可能ファイルが実行中であることを示しました。マウスを動かすとすぐにコンピューターがアイドル状態から抜け出し、null実行可能ファイルがタスクリストから消えました。

ここからは、pslist(-accepteulaスイッチを使用して、コンピューターにデプロイされているコンピューターで実際にプログラムが実行されるように)を使用するタスク(またはプログラム-私がPythonおよびpy2exeで実行している)を設定することです。 null exeが実行されているかどうかを確認してください。実行中の場合、pslistはエラーなしで実行されたため、%ERRORLEVEL%環境変数は0に設定されます。その環境変数が1の場合、エラーが発生して実行されました(実行可能ファイルが実行されていませんでした)。コンピューターがアイドル状態でない場合、別のタスクを実行するためにバッチスクリプトでその環境変数を利用しています。


Windows 7のアイドル状態をどのように定義しますか?
Der Hochstapler 2012

私が知っていればいいのに。私はおそらくそれをハッキングする方法を見てきました。私が見つけた(そしてテストした)最良の答えは、アイドル状態は15分のユーザーアクティビティ(キーボードやマウスなどの入力)がなく、CPU使用率がほとんどないときにトリガーされるようです。
r_alex_hall 2012年

ちなみに、私はこのWindowsイベントが非常に不安定であることがわかったと思います(再開されたユーザーアクティビティに常に応答するわけではありませんでした)。質問で達成しようとした目標は、プログラムでAutoHotkeyを使用した方がはるかに優れていました。開発:github.com/r-alex-hall/farmComm
r_alex_hall

回答:


4

アイドルイベント(アイドル状態の開始または終了)でトリガーの「境界」を検出するメソッドを実装することはできないと思いますが、Windowsを強制的にアイドル状態にしてアイドルトリガータスクを実行するコマンドがあります:

Rundll32.exe advapi32.dll,ProcessIdleTasks

別のイベント(イベントログから)を組み合わせてこのコマンドを実行すると、アイドル状態で実行する必要がある別のタスクをトリガーできます。あなたが知っている限り、あなたが望むかもしれないどんなタスクでも自由に組み合わせることができます。


1
うーん 。。。それは私を考えるように導きます。。。Rundll32.exeがなくても、その方法でアプローチできます。コンピューターのアイドル状態でProgAを実行するようにスケジュールされたtaskAをセットアップし、次に、毎分1回、batchB.batを実行するTaskBをセットアップできます。BatchB.batはPslistを使用して、ProgAが実行されているかどうかを確認します(実行されていない場合は、ProgBを実行します)。コンピュータがアイドル状態のままでもProgAは実行を続けるため、それ自体では機能しません。。。だが 。。。(私は気づきました!)「コンピューターがアイドル状態でなくなったら[プログラム]を停止する」というタスクスケジューラの条件があります。それがProgAの実行を強制終了した場合、batchB.batはProgBを実行します。
r_alex_hall 2012
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.