How to obtain battery information in Windows Store Applications?

Some applications need to display battery information to the users all the times. Today WINRT api's don't provide a way for obtaining the battery information. If battery information is absolutely must for you, you could potentially use CallNtPowerInformation (win32) function. Please note that by making a Win32 API call your application will not pass the Windows store certification. This is viable option only if you are side-loading the application.

Which API to Call?

https://msdn.microsoft.com/en-us/library/windows/desktop/aa372675(v=vs.85).aspx  particularly the SystemBatteryState information level. This is a Win32 API that can be called from C++ as well as C# code.

How to call the API?

int size = Marshal.SizeOf<Interop.SYSTEM_BATTERY_STATE>();

            int status;

            IntPtr batteryStatePtr = Marshal.AllocCoTaskMem(size);

            try

            {

                status = Interop.CallNtPowerInformation(

                    Interop.POWER_INFORMATION_LEVEL.SystemBatteryState,

                    IntPtr.Zero,

                    0,

                    batteryStatePtr,

                    (uint)size);

 

                   if (status >= 0)

                   {

                    Interop.SYSTEM_BATTERY_STATE batteryState =

                        Marshal.PtrToStructure<Interop.SYSTEM_BATTERY_STATE>(batteryStatePtr);                         

 

                          this.Status.Text = String.Format("Battery level: {0}/{1}",

                        batteryState.RemainingCapacity, batteryState.MaxCapacity);

                   }

                   else

                   {

                          this.Status.Text = String.Format("Battery level: {0:X}", status);

                   }

            }

            finally

            {

                Marshal.FreeCoTaskMem(batteryStatePtr);

            }

static class Interop

    {

        public enum POWER_INFORMATION_LEVEL {

            SystemPowerPolicyAc,

            SystemPowerPolicyDc,

            VerifySystemPolicyAc,

            VerifySystemPolicyDc,

            SystemPowerCapabilities,

            SystemBatteryState,

            SystemPowerStateHandler,

            ProcessorStateHandler,

            SystemPowerPolicyCurrent,

            AdministratorPowerPolicy,

            SystemReserveHiberFile,

            ProcessorInformation,

            SystemPowerInformation,

            ProcessorStateHandler2,

            LastWakeTime,

            LastSleepTime,

            SystemExecutionState,

            SystemPowerStateNotifyHandler,

            ProcessorPowerPolicyAc,

            ProcessorPowerPolicyDc,

            VerifyProcessorPowerPolicyAc,

            VerifyProcessorPowerPolicyDc,

            ProcessorPowerPolicyCurrent,

            SystemPowerStateLogging,

            SystemPowerLoggingEntry,

            SetPowerSettingValue,

            NotifyUserPowerSetting,

            PowerInformationLevelUnused0,

            SystemMonitorHiberBootPowerOff,

            SystemVideoState,

            TraceApplicationPowerMessage,

            TraceApplicationPowerMessageEnd,

            ProcessorPerfStates,

            ProcessorIdleStates,

            ProcessorCap,

            SystemWakeSource,

            SystemHiberFileInformation,

            TraceServicePowerMessage,

            ProcessorLoad,

            PowerShutdownNotification,

            MonitorCapabilities,

            SessionPowerInit,

            SessionDisplayState,

            PowerRequestCreate,

            PowerRequestAction,

            GetPowerRequestList,

            ProcessorInformationEx,

            NotifyUserModeLegacyPowerEvent,

            GroupPark,

            ProcessorIdleDomains,

            WakeTimerList,

            SystemHiberFileSize,

            ProcessorIdleStatesHv,

            ProcessorPerfStatesHv,

            ProcessorPerfCapHv,

            ProcessorSetIdle,

            LogicalProcessorIdling,

            UserPresence,

            PowerSettingNotificationName,

            GetPowerSettingValue,

            IdleResiliency,

            SessionRITState,

            SessionConnectNotification,

            SessionPowerCleanup,

            SessionLockState,

            SystemHiberbootState,

            PlatformInformation,

            PdcInvocation,

            MonitorInvocation,

            FirmwareTableInformationRegistered,

            SetShutdownSelectedTime,

            SuspendResumeInvocation,

            PlmPowerRequestCreate,

            ScreenOff,

            CsDeviceNotification,

            PlatformRole,

            LastResumePerformance,

            DisplayBurst,

            ExitLatencySamplingPercentage,

            RegisterSpmPowerSettings,

            PlatformIdleStates,

            ProcessorIdleVeto,

            PlatformIdleVeto,

            SystemBatteryStatePrecise,

            ThermalEvent,

            PowerInformationLevelMaximum

        }

 

        public struct SYSTEM_BATTERY_STATE

        {

            public byte AcOnLine;

            public byte BatteryPresent;

            public byte Charging;

            public byte Discharging;

            public byte spare1;

            public byte spare2;

            public byte spare3;

            public byte spare4;

            public UInt32 MaxCapacity;

            public UInt32 RemainingCapacity;

            public Int32 Rate;

            public UInt32 EstimatedTime;

            public UInt32 DefaultAlert1;

            public UInt32 DefaultAlert2;

        }

 

        [DllImport("powrprof.dll", SetLastError = true)]

        public static extern Int32 CallNtPowerInformation(

             POWER_INFORMATION_LEVEL InformationLevel,

             IntPtr lpInputBuffer,

             UInt32 nInputBufferSize,

             IntPtr lpOutputBuffer,

             UInt32 nOutputBufferSize);

    }

 

 

 

 

BatteryApp.zip