¿Hay alguna manera de ejecutar un programa en eventos de energía?


11

Básicamente estoy buscando una manera de ejecutar una aplicación cuando mi computadora portátil pasa a la batería y, de manera similar, cuando vuelve a la CA.

¿Hay un enlace incorporado en Windows o una aplicación de terceros que me permita responder a tales eventos?

EDITAR

He examinado el TaskScheduler tratando de disparar una tarea en un evento de "encendido", pero parece que no se registra ningún evento al cambiar a la batería.


¿Por qué tengo la sensación de que voy a necesitar escribir esta aplicación?
Ryan Emerle

Una aplicación funcionaría, pero es posible que solo necesite un script.
bw

Hola hombre, llegué seis años tarde a la fiesta, pero creo que tengo algo que vale la pena ver ...
FoxDeploy

Respuestas:


8

Escribí una aplicación ( http://batterysaver.codeplex.com/ ) que escuchará un mensaje de cambio de modo de energía y ejecutará acciones basadas en una configuración XML.

Si alguien más puede usarlo o extenderlo, entonces increíble. Si hay algo mejor, publíquelo.


Como una mejora, en lugar de sondear GetSystemPowerStatus, cree una aplicación para recibir mensajes WM_POWERBROADCAST que Windows envía cuando cambia el estado de energía: msdn.microsoft.com/en-us/library/aa373247%28VS.85%29.aspx
shf301

@ shf301: gracias por la sugerencia; Lo actualicé para responder al evento de cambio del modo de energía.
Ryan Emerle

@RyanEmerle ¡Buena aplicación!
Moab

@RyanEmerle De acuerdo muy buena aplicación!
Cosco Tech

Si quiero cambiar el perfil de la batería en eventos de energía, ¿qué debo agregar en la configuración?
simongcc

4

No conozco un comando simple que pueda ejecutar para esto, pero las secuencias de comandos deberían poder hacerlo.

Intente interceptar el evento Win32_PowerManagementEvent en PowerShell o WSH . El artículo de tomshardware tiene un código vbscript, pero creo que necesitará un caso para eventtype 10 (cambio de powerstate). StackOverflow tiene algunas ideas en ¿Cómo puedo saber cuándo Windows entra / sale del modo de suspensión o Hibernate? , aunque tendrá que ampliar la idea para manejar el cambio de estado de energía en lugar de suspender / hibernar. También puede encontrar algunas ideas en el código para la pregunta ¿Cómo se usa ManagementEventWatcher para realizar un seguimiento de la suspensión / reanudación?

EDITAR: De hecho, intente algo como esto. Esto está totalmente pirateado, por lo que no es bonito. Cambie las declaraciones de Echo para hacer lo que desee si se detecta un cambio en la alimentación de CC o CA. Corre concscript 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

La idea es iniciar / detener aplicaciones cuando se pasa de un estado a otro para conservar la energía de la batería. Por lo tanto, no quiero vencer el propósito ejecutando un script pesado (WMI es un poco pesado). +1 para la respuesta detallada aunque.
Ryan Emerle

@ Ryan - bueno, sí. Una aplicación que se registre para el enfoque WM_POWERBROADCAST es mejor en ese caso.
bw

2

Me encanta el enfoque de Bill, pero él no le dice cómo registrarse para un evento WMI en PowerShell, así que aquí le mostramos cómo hacerlo.

Si desea que su código se active solo cuando cambie el estado de alimentación del sistema, como se describe aquí , use este código.

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

Ahora, esto se activará cada vez que cambie el estado de alimentación, ya sea que conecte el dispositivo, O lo desenchufe. Por lo tanto, es posible que desee parar y hacer una pausa para hacer la pregunta:

¿Estoy en el poder o no?

Afortunadamente, podemos hacerlo a través de la clase WMI BatteryStatus, así que aquí está la construcción completa que uso para ejecutar SOLO una operación cuando cambia un evento de energía, y luego solo si ya no estoy en Energía.

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()
     }
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.