Existe uma maneira de executar um programa em eventos de energia?

11

Basicamente, estou procurando uma maneira de executar um aplicativo quando meu laptop passar para a energia da bateria e, da mesma forma, quando retornar ao AC.

Existe um gancho interno no Windows ou um aplicativo de terceiros que me permita responder a esses eventos?

EDITAR

Analisei o TaskScheduler tentando disparar uma tarefa em um evento "power", mas nenhum evento parece ser registrado ao mudar para a bateria.

Ryan Emerle
fonte
Por que eu tenho a sensação de que eu estou indo para necessidade de escrever este aplicativo ..
Ryan Emerle
Um aplicativo funcionaria, mas você pode precisar apenas de um script.
BW
Ei cara, eu estava prestes seis anos atrasado para a festa, mas eu acho que eu tenho algo vale a pena ver ...
FoxDeploy

Respostas:

8

Eu escrevi um aplicativo ( http://batterysaver.codeplex.com/ ) que escutará uma mensagem de alteração no modo de energia e executará ações com base em uma configuração XML.

Se alguém puder usá-lo ou ampliá-lo, então é incrível. Se houver algo melhor, publique-o.

Ryan Emerle
fonte
Como um aprimoramento, em vez de pesquisar GetSystemPowerStatus, crie um aplicativo para receber mensagens WM_POWERBROADCAST que o Windows envia quando o estado de energia é alterado: msdn.microsoft.com/en-us/library/aa373247%28VS.85%29.aspx
shf301
@ shf301 - obrigado pela dica; Atualizei-o para responder ao evento de alteração do modo de energia.
Ryan Emerle
@RyanEmerle Nice app!
Moab
@RyanEmerle Concordou com um aplicativo muito bom!
Cosco Tecnologia
Se eu quiser alterar o perfil da bateria em eventos de energia, o que devo adicionar na configuração?
simongcc
4

Não conheça um comando simples que você possa executar para isso, mas o script deve poder fazer isso.

Tente interceptar o evento Win32_PowerManagementEvent no PowerShell ou WSH . O artigo tomshardware tem algum código vbscript, mas acho que você precisará de um caso para o eventtype 10 (alteração da potência). O StackOverflow tem algumas idéias em Como posso saber quando o Windows entra / sai do modo de suspensão ou de hibernação? , embora você precise estender a idéia para lidar com a alteração do estado de energia em vez de suspensão / hibernação. Você também pode encontrar algumas idéias no código da pergunta Como alguém usa o ManagementEventWatcher para acompanhar a suspensão / retomada?

Edição: Na verdade, tente algo parecido com isto. Isso é totalmente hackeado, então não é bonito. Altere as instruções de eco para fazer o que quiser, se for detectada alteração na energia CC ou CA. Correr comcscript 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
bw
fonte
A idéia é iniciar / parar aplicativos ao fazer a transição de um estado para outro para economizar energia da bateria. Portanto, não quero derrotar o objetivo executando um script pesado (o WMI é um pouco pesado). +1 para a resposta detalhada tho.
Ryan Emerle
@ Ryan - bem, sim. Um aplicativo registrado para a abordagem WM_POWERBROADCAST é melhor nesse caso.
BW
2

Adoro a abordagem de Bill, mas ele não diz como se registrar para um evento WMI no PowerShell, então veja como fazê-lo.

Se você deseja que seu código seja acionado apenas quando o estado de energia do sistema for alterado, conforme descrito aqui , use esse código.

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

Agora, isso será acionado sempre que o estado de energia mudar, se você conectar o dispositivo ou desconectá-lo. Portanto, você pode querer parar e fazer uma pausa para fazer a pergunta:

Estou no poder ou não?

Felizmente, podemos fazer isso por meio da classe WMI BatteryStatus, então aqui está a construção completa que eu uso para executar SOMENTE uma operação quando um evento de energia é alterado e somente se não estiver mais no 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
fonte