Super User is a question and answer site for computer enthusiasts and power users. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

I'm basically looking for a way to execute an application when my laptop transitions to battery power and, similarly, when it returns to AC.

Is there a built-in hook in Windows or a third-party application that will allow me to respond to such events?


I've looked into the TaskScheduler trying to fire off a task on a "power" event, but no event seems to be logged when switching to battery.

share|improve this question
Why do I have the sinking feeling that I'm going to need to write this app.. – Ryan Emerle Mar 17 '10 at 18:45
An app would work, but you might just need a script. – bill weaver Mar 17 '10 at 19:50
up vote 4 down vote accepted

I wrote an application ( that will listen for a power mode change message and execute actions based on an XML configuration.

If someone else can use it, or extend it, then awesome. If there's something better, then please post it.

share|improve this answer
As an enhancement, rather than polling GetSystemPowerStatus create an application to receive an WM_POWERBROADCAST messages that Windows sends when the power state changes: – shf301 Mar 18 '10 at 3:25
@shf301 - thanks for the tip; I updated it to respond to the power mode change event. – Ryan Emerle Mar 18 '10 at 14:35
@RyanEmerle Nice app! – Moab Jun 4 '12 at 3:59
@RyanEmerle Agreed very nice app! – Cosco Tech Mar 11 '15 at 16:12

Don't know of a simple command you can run for this, but scripting should be able to do this.

Try intercepting the Win32_PowerManagementEvent event in PowerShell or WSH. The tomshardware article has some vbscript code, but i think you'll need a case for eventtype 10 (powerstate change). StackOverflow has some ideas at How can I know when Windows is going into/out of sleep or Hibernate mode?, though you'll have to extend the idea to handle power state change instead of sleep/hibernate. You might also find some ideas in the code for the question How does one use ManagementEventWatcher to keep track of suspend/resume?

EDIT: In fact, try something like this. This is totally hacked together, so it's not pretty. Change the Echo statements to do whatever you want if change to DC or AC power is detected. Run with cscript power.vbs


Dim battery_status, prev_status
prev_status = CheckBattery
Set colMonitoredEvents = GetObject("winmgmts:\\.\root\cimv2")._
    ExecNotificationQuery("Select * from Win32_PowerManagementEvent")
    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

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
End Function
share|improve this answer
The idea is to start/stop applications when transitioning from one state to another to conserve battery power. Therefore I don't want to defeat the purpose by running a heavy script (WMI is a bit heavy). +1 for the detailed answer tho. – Ryan Emerle Mar 17 '10 at 20:54
@Ryan - well, yeah. An application registering for WM_POWERBROADCAST approach is better in that case. – bill weaver Mar 18 '10 at 14:44

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .