i want to be a good developer citizen, pay my taxes, and disable things if we\'re running over Remote Desktop, or running on battery.
If we\'re running over remote d
You could use WMI (Windows Management Instrumentation) to query the operating system about the battery status.
You could find more information here:
Hope that helps.
Powerlord's answer doesn't seem to work, probably because it was answered in 2008.
Here is a version that worked for me:
Boolean x = (System.Windows.SystemParameters.PowerLineStatus == System.Windows.PowerLineStatus.Offline);
You could use the GetSystemPowerStatus function using P/Invoke. See: http://msdn.microsoft.com/en-gb/library/aa372693.aspx
Here's an example:
using System;
using System.Runtime.InteropServices;
namespace PowerStateExample
{
[StructLayout(LayoutKind.Sequential)]
public class PowerState
{
public ACLineStatus ACLineStatus;
public BatteryFlag BatteryFlag;
public Byte BatteryLifePercent;
public Byte Reserved1;
public Int32 BatteryLifeTime;
public Int32 BatteryFullLifeTime;
// direct instantation not intended, use GetPowerState.
private PowerState() {}
public static PowerState GetPowerState()
{
PowerState state = new PowerState();
if (GetSystemPowerStatusRef(state))
return state;
throw new ApplicationException("Unable to get power state");
}
[DllImport("Kernel32", EntryPoint = "GetSystemPowerStatus")]
private static extern bool GetSystemPowerStatusRef(PowerState sps);
}
// Note: Underlying type of byte to match Win32 header
public enum ACLineStatus : byte
{
Offline = 0, Online = 1, Unknown = 255
}
public enum BatteryFlag : byte
{
High = 1, Low = 2, Critical = 4, Charging = 8,
NoSystemBattery = 128, Unknown = 255
}
// Program class with main entry point to display an example.
class Program
{
static void Main(string[] args)
{
PowerState state = PowerState.GetPowerState();
Console.WriteLine("AC Line: {0}", state.ACLineStatus);
Console.WriteLine("Battery: {0}", state.BatteryFlag);
Console.WriteLine("Battery life %: {0}", state.BatteryLifePercent);
}
}
}
I believe you can check SystemInformation.PowerStatus to see if it's on battery or not.
Boolean isRunningOnBattery =
(System.Windows.Forms.SystemInformation.PowerStatus.PowerLineStatus ==
PowerLineStatus.Offline);
Edit: In addition to the above, there's also a System.Windows.Forms.PowerStatus class. One of its methods is PowerLineStatus, which will equal PowerLineStatus.Online if it's on AC Power.
R. Bemrose found the managed call. Here's some sample code:
/// <summary>
/// Indicates if we're running on battery power.
/// If we are, then disable CPU wasting things like animations, background operations, network, I/O, etc
/// </summary>
public static Boolean IsRunningOnBattery
{
get
{
PowerLineStatus pls = System.Windows.Forms.SystemInformation.PowerStatus.PowerLineStatus;
//Offline means running on battery
return (pls == PowerLineStatus.Offline);
}
}
I don't believe it's exposed in managed code, but you can use the Win32 GetSystemPowerStatus via pinvoke to get this info.
As an aside, you may want to consider using the GetCurrentPowerPolicies or similar to determine the users preferences relating to performance/power management.