Windows 7 のタスク スケジューラを使用すると、コンピューターがアイドル状態になったときにタスクを実行できますが、コンピューターがアイドル状態から再開したとき、またはアイドル状態でなくなったときにタスクを実行する明確な方法はないようです。
コンピュータがアイドル状態でなくなったときに、Windows で何らかのイベント (イベント ログなど) がトリガーされるのは確かですか? または、コンピュータがアイドル状態でなくなったという事実をキャプチャし、スケジュールされたタスクでそれに応答する方法はありますか?
どうすればいいでしょうか?
あるいは、最悪の場合、コンピュータがアイドル状態になったり、アイドル状態から抜けたりするときにコマンドやイベントを呼び出すことができるコマンドライン プログラムがどこかにあるのでしょうか?
[更新:] 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()
--そして、Windows でスケジュールされたタスクを設定します。このタスクの 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>
そして、コンピューターを 15 分間アイドル状態にしました。タスク マネージャーには、null 実行ファイルが実行中であることが示されました。マウスを動かすとすぐに、コンピューターはアイドル状態から解除され、null 実行ファイルはタスク リストから消えました。
ここからは、pslist (-accepteula スイッチを使用して、配置先のコンピュータで実際にプログラムを実行する) を使用して null exe が実行中かどうかを確認するタスク (またはプログラム - Python と py2exe で実行中) を設定するだけです。実行中の場合、pslist はエラーなしで実行されたため、%ERRORLEVEL% 環境変数は 0 に設定されます。この環境変数が 1 の場合、エラーが発生して実行されました (実行中の実行ファイルが見つからなかった)。この環境変数をバッチ スクリプトで利用して、コンピュータが実行中の場合、別のタスクを実行します。ないアイドル。
答え1
アイドル イベント (アイドル状態の開始または終了) でトリガーの「境界」を検出するメソッドを実装することはできないと思いますが、Windows を強制的にアイドル状態にしてアイドル トリガー タスクを実行するコマンドがあります。
Rundll32.exe advapi32.dll,ProcessIdleTasks
別のイベント (イベント ログから) を組み合わせてこのコマンドを実行すると、アイドル状態で実行する必要がある別のタスクがトリガーされます。 ご存知のとおり、必要なタスクを自由に組み合わせることができます。