10

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

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

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

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

3 ответа3

6

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

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

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
1

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

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

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

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

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

К счастью, мы можем сделать это через класс BatteryStatus WMI, так что вот полная конструкция, которую я использую, чтобы ТОЛЬКО запустить операцию, когда событие питания изменяется, и только тогда, когда я больше не на 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()
     }

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