Quale evento dell'utilità di pianificazione di Windows 7 risponderebbe a una condizione END inattiva?


8

L'utilità di pianificazione di Windows 7 mi consente di eseguire un'attività quando il computer diventa inattivo, ma non sembra esserci alcun modo ovvio per eseguire un'attività quando il computer riprende da inattivo o non è più inattivo.

Sicuramente c'è qualche evento attivato in Windows (un registro eventi?) Quando il computer non è più inattivo? O un modo per catturare il fatto che il computer non è più inattivo e rispondere a quello con un'attività pianificata?

Come lo farei?

O, nel peggiore dei casi, esiste un programma da riga di comando che può invocare comandi o eventi quando il computer entra / esce dallo stato di inattività?

[AGGIORNAMENTO:] L'approccio nella mia risposta a Diogo Rocha funziona. Ho creato un eseguibile null tramite py2exe da questo script:

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

--e imposta un'attività pianificata in Windows per la quale si tratta dell'HTML esportato:

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

E ho lasciato il computer inattivo per 15 minuti. Il task manager ha mostrato l'esecuzione eseguibile null. Non appena ho spostato il mouse, il computer è rimasto inattivo e l'eseguibile null è scomparso dall'elenco delle attività.

Da qui, si tratta di impostare un'attività (o un programma - che sto facendo con Python e py2exe) che utilizza pslist (con un interruttore -accepteula in modo che sui computer su cui è distribuito eseguirà effettivamente il programma) per controlla se l'exe null è in esecuzione. Se è in esecuzione, la variabile di ambiente% ERRORLEVEL% è impostata su 0 perché pslist è stata eseguita senza errori. Se quella variabile di ambiente è 1, è stata eseguita con un errore (non ha trovato il file eseguibile in esecuzione). Sto sfruttando quella variabile d'ambiente in uno script batch per eseguire un'altra attività se il computer non è inattivo.


Come si definisce lo stato inattivo di Windows 7?
Der Hochstapler,

Vorrei saperlo. Ho visto modi per presumibilmente hackerarlo; la risposta migliore che ho trovato (e testato) è che lo stato di inattività sembra essere attivato con 15 minuti di inattività dell'utente (input di tastiera o mouse, ecc.) e un ridotto utilizzo della CPU.
r_alex_hall

Cordiali saluti, penso di aver trovato questo evento di Windows molto traballante (non ha sempre risposto alla ripresa dell'attività dell'utente) e gli obiettivi che ho cercato di raggiungere con la domanda sono stati raggiunti molto meglio tramite AutoHotkey, in un programma che sviluppato: github.com/r-alex-hall/farmComm
r_alex_hall

Risposte:


4

Non penso che sia possibile implementare alcun metodo per rilevare un "bordo" di trigger su eventi inattivi (entra o esci dallo stato inattivo), tuttavia esiste un comando che obbliga Windows a entrare nello stato inattivo ed eseguire attività attivate inattive :

Rundll32.exe advapi32.dll,ProcessIdleTasks

È possibile combinare un altro evento (dal registro eventi) per eseguire questo comando che a sua volta attiva un'altra attività che deve essere eseguita nello stato inattivo. Per quanto ne sai, puoi combinare liberamente qualsiasi attività tu possa desiderare.


1
Hmm . . questo mi porta a pensare. . . Potrei avvicinarmi in quel modo, senza Rundll32.exe. Potrei impostare l'attività pianificata A per eseguire ProgA su computer inattivo - e quindi impostare un TaskB, che esegue batchB.bat una volta al minuto. BatchB.bat userebbe Pslist per verificare se ProgA è in esecuzione (e in caso contrario, eseguire ProgB). Questo da solo non funzionerebbe perché ProgA continuerebbe a funzionare anche se il computer lascia inattivo. . . MA . . . (Ho appena realizzato!) C'è una condizione dell'utilità di pianificazione per "Arrestare [il programma] se il computer cessa di essere inattivo". Se questo uccide l'esecuzione di ProgA, batchB.bat eseguirà ProgB!
r_alex_hall,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.