Есть ли способ выполнить программу на событиях питания?

11

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

Есть ли встроенный хук в Windows или стороннее приложение, которое позволит мне отвечать на такие события?

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

Я смотрел на TaskScheduler, пытаясь запустить задачу при событии «power», но при переключении на батарею событие не регистрируется.

Райан Эмерл
источник
Почему у меня тонет чувство, что мне нужно написать это приложение ..
Райан Эмерл
Приложение будет работать, но вам может понадобиться скрипт.
мт
Эй, чувак, я был на вечеринке примерно на шесть лет позже, но я думаю, что у меня есть кое-что, что стоит посмотреть ...
FoxDeploy

Ответы:

8

Я написал приложение ( http://batterysaver.codeplex.com/ ), которое будет прослушивать сообщение об изменении режима питания и выполнять действия на основе конфигурации XML.

Если кто-то еще может использовать его или расширить, тогда это здорово. Если есть что-то получше, пожалуйста, напишите об этом.

Райан Эмерл
источник
В качестве усовершенствования вместо опроса GetSystemPowerStatus создайте приложение для получения сообщений WM_POWERBROADCAST, отправляемых Windows при изменении состояния питания: msdn.microsoft.com/en-us/library/aa373247%28VS.85%29.aspx
shf301
@ shf301 - спасибо за подсказку; Я обновил его, чтобы ответить на событие изменения режима питания.
Райан Эмерл
@RyanEmerle Хорошее приложение!
Моав
@RyanEmerle Согласился, очень хорошее приложение!
Cosco Tech
Если я хочу изменить профиль батареи в событиях питания, что я должен добавить в конфигурации?
simongcc
4

Не знаю простой команды, которую вы можете запустить для этого, но сценарий должен уметь это делать.

Попробуйте перехватить событие Win32_PowerManagementEvent в PowerShell или WSH . В статье по tomshardware есть некоторый код vbscript, но я думаю, что вам понадобится сценарий для типа события 10 (изменение состояния состояния). У StackOverflow есть несколько идей о том, как узнать, когда Windows входит в / из спящего режима или в режим гибернации? хотя вам придется расширить идею обработки изменения состояния питания вместо режима сна / гибернации. Вы также можете найти некоторые идеи в коде вопроса: как использовать ManagementEventWatcher для отслеживания приостановки / возобновления?

РЕДАКТИРОВАТЬ: На самом деле, попробуйте что-то вроде этого. Это полностью взломано вместе, так что это не красиво. Измените операторы Echo так, чтобы они делали все, что вы хотите, если обнаруживается изменение на постоянный или переменный ток. Бежать сcscript power.vbs

power.vbs

Dim battery_status, prev_status
prev_status = CheckBattery
Set colMonitoredEvents = GetObject("winmgmts:\\.\root\cimv2")._
    ExecNotificationQuery("Select * from Win32_PowerManagementEvent")
Do
    Set strLatestEvent = colMonitoredEvents.NextEvent
    If strLatestEvent.EventType = 10 Then
        battery_status = CheckBattery
        If battery_status <> prev_status Then
            If battery_status = 1 Then
                Wscript.Echo "DC power"
            ElseIf battery_status = 2 Then
                Wscript.Echo "AC power"
            End If
        End If
    End If
    prev_status = battery_status
Loop

Function CheckBattery
    Dim oWMI, items, item
    Set oWMI = GetObject("winmgmts:\\.\root\cimv2")
    Set items = oWMI.ExecQuery("Select * from Win32_Battery",,48)
    For Each item in items
        If item.BatteryStatus = 1 Then
            CheckBattery = 1
            Exit Function
        ElseIf item.BatteryStatus = 2 then
        CheckBattery = 2
            Exit Function
        End If
    Next
End Function
м.т.
источник
Идея состоит в том, чтобы запускать / останавливать приложения при переходе из одного состояния в другое для экономии заряда батареи. Поэтому я не хочу побеждать цель, выполняя тяжелый скрипт (WMI немного тяжел). +1 за подробный ответ.
Райан Эмерл
@ Райан - ну да. Приложение, регистрирующееся для подхода WM_POWERBROADCAST, лучше в этом случае.
мт
2

Мне нравится подход Билла, но он не говорит вам, как зарегистрироваться на событие WMI в PowerShell, поэтому вот как это сделать.

Если вы хотите, чтобы ваш код срабатывал только при изменении состояния питания системы, как описано здесь , используйте этот код.

Register-WMIEvent -query "Select * From Win32_PowerManagementEvent" `
 -sourceIdentifier "Power" `
 -action {
     #YourCodeHere
      }

Теперь это будет срабатывать при каждом изменении состояния питания, независимо от того, подключаете ли вы устройство или отключаете его. Таким образом, вы можете остановиться и остановиться, чтобы задать вопрос:

Я у власти или нет?

К счастью, мы можем сделать это через класс WMI BatteryStatus, так что вот полная конструкция, которую я использую, чтобы ТОЛЬКО запустить операцию, когда событие питания изменяется, и только тогда, когда я больше не на Power.

Register-WMIEvent -query "Select * From Win32_PowerManagementEvent" `
  -sourceIdentifier "Power" `
  -action {
      if ([BOOL](Get-WmiObject -Class BatteryStatus -Namespace root\wmi).PowerOnLine ){
         #Device is plugged in now, do this action
         write-host "Power on!"
     }
    else{
        #Device is NOT plugged in now, do this action
        write-host "Now on battery, locking..."
        [NativeMethods]::LockWorkStation()
     }
FoxDeploy
источник