Introduction
This articles explains how to make an application aware of the Battery Status when in use on a laptop/tablet.
PowerMode change comes from Intel documentation on devx. The current power status comes from MSDN in a longhorn article.
Background
See Cancellable Thread Pool for why this is here. This is a very raw and ready post as it's just a couple of searches anyway. The only bit of my code really is the constructor which ensures you have results whenever you instantiate the class.
Using the code
Run the application, and then attempt to generate as many PowerChange
events as possible. With a modern ACPI capable desktop PC, you will probably be able to generate Suspend
and Resume
events. Attempting to change the ACLineStatus
is not recommended.
With a laptop/tablet, you should be able to generate the full range of events as long as your battery holds some charge.
The MSDN/Intel documentation does not indicate if these power events are also available from servers via UPS. If anyone has a development machine on a UPS, I would be interested to see a trace of the events. (The file is automatically saved when the application shuts down, see frmPowerDemo_Closed()
.)
Code Features
There are two parts to this code, firstly detecting PowerChange
events, and secondly, finding out the current status. To detect a PowerChange
, you first need to use the Microsoft.Win32
namespace, and wire in the event.
using Microsoft.Win32;
SystemEvents.PowerModeChanged
+= new PowerModeChangedEventHandler(SystemEvents_PowerModeChanged);
Next, it's a simple case of declaring your handler in the usual method.
private void SystemEvents_PowerModeChanged(object sender,
PowerModeChangedEventArgs e)
{
The PowerModeChanged
event provides the initial information as to why you get the event, e.g., PowerModeChangedEvent.Suspend
, .Resume
and .StatusChange
. However, you will usually require slightly more complex logic, e.g.:
PowerStatus ps = new PowerStatus();
switch (e.Mode)
{
case PowerModes.Resume:
if (ps.BatteryFlag & _BatteryStatus.Critical
!= _BatteryStatus.Critical)
{
The PowerStatus
class is used to provide detail to the current state. It will automatically read the current power status when it is constructed, so all you need to do is read the values off. Of most value are the BatteryFlag
and ACLineStatus
fields. Both of these are enumerated to provide useful information, although the BatteryFlag
is a bitmapped field.
Points of Interest
This code can be used in combination with Threading to provide applications that will throttle back the CPU usage as power becomes critical.
History
v0.1a 13th Sept 2004. First release.