4

Я пытаюсь автоматизировать освещение вокруг пещеры человека, в идеале мне бы хотелось, чтобы огни были включены, пока экраны компьютера включены и огни гаснут при включении заставки, без использования какого-либо дополнительного программного обеспечения.

До сих пор мне удавалось перехватывать события 4802 (запуск заставки) и 4803 (остановка заставки) и использовать планировщик задач и скрипт curl для запуска http-запроса на машину, которая обрабатывает источники света, и это работает, в некоторой степени.

Проблема заключается в том, что всякий раз, когда машина переходит в состояние низкого энергопотребления, хранитель экрана уничтожается и регистрируется 4803, и я не могу отличить экранную заставку, убитую при вводе пользователем или при переходе окон в состояние низкого энергопотребления.

По сути, мне нужно ловить некоторые события, которые происходят, когда экраны выключаются и включаются. Есть ли что-нибудь (в общей установке win7), к которому я мог бы подключиться?

Благодарю.

РЕДАКТИРОВАТЬ:

Я прошу прощения у людей, которые уже ответили на этот вопрос, мой вопрос был сформулирован недостаточно четко. Рассматриваемая машина фактически не переходит в состояние сна, следовательно, в журналах событий не генерируется событие 42(питание ядра) или событие 1(устранение неполадок питания), машина входит только в какое-то состояние с низким энергопотреблением, где она потребляет около 53 Вт вместо обычных 180 Вт, хотя я мог бы использовать это для отслеживания состояния питания этой конкретной машины, я не смог бы использовать тот же метод обнаружения для других 3 компьютеров в комнате, поскольку они не имеют необходимое оборудование (ИБП), подключенное к ним.

То, что я ищу, это события, которые происходят всякий раз, когда мониторы компьютера выключаются и снова включаются окнами (а не их соответствующими кнопками питания) в результате управления питанием окон. В основном все, что позволило бы мне синхронизировать источники света в пещере с состоянием мониторов и позволить планировщику задач запустить сценарий, который управляет источниками света.

1 ответ1

2

Надеюсь, вы уже нашли другое решение для этой задачи, так или иначе, это была интересная проблема, над которой я хотел разобраться, и, возможно, кому-то еще это поможет. Вместо того, чтобы пытаться отслеживать состояния экранной заставки, мое решение использует параметры мониторинга "бездействия" в планировщике задач. Хотя он был построен на Windows 10, я считаю, что используемые функции должны быть одинаковыми в W7.

обзор

  • Запланированная задача Windows "Idle" запускает сценарий "Idle" и использует встроенные параметры ожидания на вкладке условий, чтобы дождаться запуска компьютера в режиме ожидания, а затем остановится, если / когда компьютер перестанет работать.
  • Сценарий "Idle" запускает сценарий "Watcher", выполняет выбранное вами действие (тусклый свет), а затем продолжает работать в ожидании выхода explorer.exe, что никогда не произойдет (не должно произойти).
  • Сценарий "Watcher" находит процесс для сценария "Idle" и ожидает его завершения, прежде чем завершить свое действие (снова включить свет).

Основной путь событий

  1. Задача "Idle" пытается запускаться каждую 1 минуту, но будет выполняться только в том случае, если компьютер не используется в течение выбранного вами промежутка времени.
  2. Задача "Idle" запускает скрипт "Idle". Сценарий запускает сценарий "Watcher", запускает выбранное вами действие (тусклый свет), а затем использует командлет «wait-process» для ожидания выхода explorer.exe, что никогда не должно происходить, если Windows стабильна и поэтому продолжает работать пока ПК простаивает.
  3. Сценарий "Watcher" запускается и следит за завершением процесса сценария "Idle".
  4. Пользовательский ввод приводит к тому, что ПК выходит из состояния ожидания, убивая задачу "Idle" и, следовательно, убивая процесс powershell.exe сценария "Idle".
  5. Сценарий "Watcher" видит выход из процесса "Idle", снова включает свет и затем завершает работу.

Настроить

  1. Создайте папку с вашими скриптами, которая будет содержать оба скрипта.
  2. Скопируйте исполняемый файл powershell в вашу новую папку:

    "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" >>>> C:\scripts\dimlights\
    
  3. Создайте «Idle.ps1» и вставьте в скрипт. В первой строке скрипта укажите вашу папку, содержащую скрипты и копию 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 = Get-date echo "$ mydate - PID: $ nid - Последняя строка в режиме ожидания не должна была быть достигнута." | out-file -Append $ logfile

  4. Создайте «Watcher.ps1» в той же папке и вставьте в скрипт, снова указав папку:

    $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
    

    }

  5. Откройте планировщик заданий от имени администратора и создайте задание "Idle";

    • На вкладке "Общие" выберите "изменить пользователя или группу", под которой запускается задача.
    • В окне "Выберите пользователя или группу" нажмите кнопку "Дополнительно", затем "Найти сейчас".
    • Прокрутите вниз, чтобы найти учетную запись "SYSTEM", нажмите один раз, чтобы выделить, затем нажмите OK.
    • Нажмите OK еще раз.
    • Переключитесь на вкладку триггеров и создайте одноразовый триггер на несколько минут в будущем.
    • В дополнительных настройках установите флажок «Повторять задание каждые:», а затем введите в поле "1 минута" и измените "на время" на неопределенное время.
    • Переключитесь на вкладку действий и добавьте новое действие;
    • Поле «program /script» должно содержать путь к файлу powershell.exe, который вы скопировали ранее в папку "scripts".
    • Добавьте следующие аргументы, заменив путь к файлу своим собственным:

      -ExecutionPolicy Bypass -file "C:\scripts\idle.ps1"

    • Перейдите на вкладку условий и установите флажок, чтобы запускаться только в режиме ожидания, установив время простоя на выбранное вами время.

    • Установите флажки в двух других полях под разделом ожидания: «Остановить, если компьютер перестал работать», и «Перезагрузить, если состояние ожидания возобновится».
    • Нажмите "ОК", чтобы сохранить и закрыть запланированное задание.

Надеюсь, кто-то найдет это полезным!

Тим

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .