Espero que você já tenha encontrado outra solução para essa tarefa, de qualquer maneira, esse foi um problema interessante que eu queria resolver, e talvez alguém se beneficie. Em vez de tentar monitorar estados do protetor de tela, minha solução usa as opções de monitoramento "ociosidade" no agendador de tarefas. Enquanto isso foi construído no Windows 10, acredito que as funções usadas devem ser as mesmas no W7.
Visão geral
- A tarefa agendada de janelas "Inativas" aciona o script "Ocioso" e usa as opções ociosas integradas na guia Condições para aguardar até que o computador esteja ocioso para iniciar e, em seguida, pare se / quando o computador deixar de estar ocioso.
- O script "Idle" aciona o script "Watcher", realiza a ação escolhida (luzes fracas) e continua a executar esperando no explorer.exe para sair, o que (nunca deveria) acontecer.
- O script "Watcher" encontra o processo para o script "Inativo" e aguarda que ele saia antes de concluir sua ação (acenda as luzes novamente).
Caminho básico dos eventos
- A tarefa "Ocioso" tenta ser executada a cada 1 minuto, mas só será executada se o computador ficar ocioso pelo período de tempo escolhido.
- A tarefa "Inativa" executa o script "Ocioso". O script aciona o script "Watcher", aciona a ação escolhida (luzes fracas) e, em seguida, usa o cmdlet "wait-process" para aguardar a saída do explorer.exe, o que nunca deve acontecer, supondo que o Windows esteja estável e continue sendo executado contanto que o PC esteja ocioso.
- O script "Watcher" é iniciado e vigia o processo do script "Inativo" para sair.
- A entrada do usuário faz com que o PC saia do estado ocioso, eliminando a tarefa "Ocioso", portanto, eliminando o processo powershell.exe do script "Ocioso".
- O script "Watcher" vê a saída do processo de script "Inativo", acende as luzes e sai.
Configuração
- Crie sua pasta de script que conterá os dois scripts.
-
Copie o executável do powershell para sua nova pasta de pastas:
"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" >>>> C:\scripts\dimlights\
-
Crie "Idle.ps1" e cole no script. Na primeira linha do script, especifique sua pasta contendo scripts e cópia do powershell.exe:
$myScriptDir = "C:\scripts\dimlights\" #============= Variables ================== $logfile = join-path $myScriptDir log.txt $nid = (Get-Process explorer).Id $mydate = Get-date #============= Code ================== start-process powershell.exe -argumentlist "-NonInteractive –ExecutionPolicy Bypass -file $myScriptDir\watcher.ps1" echo "$mydate - PID: $nid - Idle start action" | out-file -Append $logfile #----------------Insert chosen action code here---------------- Wait-Process $nid
$ mydate = Data de obtenção echo "$ mydate - PID: $ nid - Última linha no Idle, não deveria ter sido atingido." | out-file -Append $ logfile
-
Crie "Watcher.ps1" na mesma pasta e cole no script, especificando novamente a pasta:
$myScriptDir = "C:\scripts\dimlights\" #============= Variables ================== $myPSPath = join-path $myScriptDir powershell.exe $logfile = join-path $myScriptDir log.txt $nid = (Get-Process powershell | Where-Object {$_.path -eq $myPSPath}).id $mydate = Get-date #============= Code ================== echo "$mydate - PID: $nid - Watcher started" | out-file -Append $logfile if ($nid -ne $null){ Wait-Process -id $nid $mydate = Get-date echo "$mydate - PID: $nid - Watcher end action" | out-file -Append $logfile #---------------- Insert chosen wake up action code here ---------------- } else { echo "$mydate - PID: $nid - No such process, exiting watcher." | out-file -Append $logfile
}
-
Abra o agendador de tarefas como administrador e crie a tarefa "Ocioso";
- Na guia geral, escolha "alterar usuário ou grupo" em que a tarefa é executada como.
- Na janela "Selecionar usuário ou grupo", clique no botão avançado e, em seguida, em "Localizar agora".
- Desça até encontrar a conta "SISTEMA", clique uma vez para destacar e clique em OK.
- Clique novamente em OK.
- Mude para a guia "Acionadores" e crie um acionador de uma vez por alguns minutos no futuro.
- Em configurações avançadas, marque a caixa para "Repetir tarefa a cada:" e digite na caixa "1 minuto" e altere "por uma duração de" para indefinidamente.
- Mude para o separador acções e adicione uma nova acção;
- A caixa "program / script" deve conter o caminho para o seu powershell.exe que você copiou para a pasta de scripts anteriormente.
-
Adicione os seguintes argumentos, substituindo o caminho do arquivo pelo seu:
-ExecutionPolicy Bypass -file "C: \ scripts \ idle.ps1"
-
Vá para a guia Condições e marque a caixa para iniciar apenas se estiver ociosa, definindo o tempo ocioso para o tempo limite escolhido.
- Verifique as outras duas caixas sob a seção ociosa "Parar se o computador parar de ficar ocioso" e "Reiniciar se o estado ocioso for retomado".
- Clique em "OK" para salvar e fechar a tarefa agendada.
Espero que alguém ache isso útil!
Tim