哪些Windows 7任务计划程序事件将响应空闲END条件?


8

Windows 7任务计划程序允许我在计算机空闲时运行任务,但是当计算机从空闲状态恢复或不再处于空闲状态时,似乎没有任何明显的方式来运行任务。

当计算机不再处于空闲状态时,是否肯定在Windows中触发了一些事件(事件日志?)?还是通过某种方式来捕获计算机不再处于空闲状态并通过计划的任务对其进行响应的事实?

我该怎么做?

或者,在最坏的情况下,当计算机进入/退出空闲状态时,某个地方是否存在可以调用命令或事件的命令行程序?

[更新:]我回复Diogo Rocha的方法有效。我通过以下脚本通过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()

-并在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分钟。任务管理器显示空可执行文件正在运行。我一移动鼠标,就使计算机退出了空闲状态,并且空可执行文件从任务列表中消失了。

从这里开始,设置一个使用pslist(带有-accepteula开关,以便在部署到它的计算机上实际上将运行该程序)的任务(或程序-我正在使用Python和py2exe进行)检查空exe是否正在运行。如果它正在运行,则将%ERRORLEVEL%环境变量设置为0,因为pslist运行时没有错误。如果该环境变量为1,则运行时出错(找不到正在运行的可执行文件)。如果计算机空闲,我将在批处理脚本中利用该环境变量来运行另一个任务。


您如何定义Windows 7 的空闲状态?
Der Hochstapler'4

希望我知道。我已经找到了据称可以破解该漏洞的方法;我发现(并测试)的最佳答案是,空闲状态似乎是由15分钟的无用户活动(键盘或鼠标等输入)和很少的CPU使用率触发的。
r_alex_hall

仅供参考,我认为我发现此Windows事件非常不稳定(它并不总是对恢复的用户活动做出响应),而我试图解决该问题的目标要比通过AutoHotkey在我编写的程序中要好得多开发:github.com/r-alex-hall/farmComm
r_alex_hall 2014年

Answers:


4

我认为无法实现任何方法来检测空闲事件(进入或退出空闲状态)时触发“边界”,但是有一条命令会强制Windows进入空闲状态并运行空闲触发的任务:

Rundll32.exe advapi32.dll,ProcessIdleTasks

您可以结合另一个事件(来自事件日志)来运行此命令,从而触发另一个必须在空闲状态下运行的任务。据您所知,您可以自由组合所需的任何任务。


1
嗯。。。这使我思考。。。如果没有Rundll32.exe,我可以采用这种方式。我可以设置计划的taskA以在计算机空闲时运行ProgA,然后设置一个TaskB,每分钟运行一次batchB.bat。BatchB.bat将使用Pslist来检查ProgA是否正在运行(如果没有运行,则运行ProgB)。这本身不会起作用,因为即使计算机闲置时ProgA仍将继续运行。。。但是。。。(我刚刚意识到!)任务调度程序的条件是“如果计算机不再处于空闲状态,则停止[程序]”。如果那杀死了ProgA的执行,那么batchB.bat将运行ProgB!
r_alex_hall
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.