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.


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.


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

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()
     }
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.