Determining the System Power Status

Information about the system power status (battery status) can be obtained using the GetSystemPowerStatus system function:

Imports System.IO
Imports System.Runtime.InteropServices

⋮

Private Declare Function GetSystemPowerStatus Lib "kernel32.dll" ( _
    ByRef lpSystemPowerStatus As SYSTEM_POWER_STATUS _
) As Boolean

<StructLayout(LayoutKind.Sequential)> _
Public Structure SYSTEM_POWER_STATUS
    Public ACLineStatus As ACLineStatus
    Public BatteryFlag As BatteryFlag
    Public BatteryLifePercent As Byte
    Public Reserved1 As Byte
    Public BatteryLifeTime As Int32
    Public BatteryFullLifeTime As Int32
End Structure

Public Enum ACLineStatus As Byte
    Offline = 0
    Online = 1
    UnknownStatus = 255
End Enum

<Flags()> _
Public Enum BatteryFlag As Byte
    High = 1
    Low = 2
    Critical = 4
    Charging = 8
    NoSystemBattery = 128
    UnknownStatus = 255
End Enum

⋮

Dim sps As SYSTEM_POWER_STATUS
If GetSystemPowerStatus(sps) Then
    Dim sw As New StringWriter()
    With sps
        sw.WriteLine("ACLineStatus: " & .ACLineStatus.ToString())
        sw.WriteLine("BatteryFlag: " & .BatteryFlag.ToString())
        sw.WriteLine( _
            "BatteryLifePercent: " & _
            IIf( _
                .BatteryLifePercent = 255, _
                "Unknown", _
                .BatteryLifePercent.ToString() & " percent" _
            ) _
        )
        sw.WriteLine( _
            "BatteryLifeTime: " & _
            IIf( _
                .BatteryLifeTime = -1, _
                "Unknown", _
                .BatteryLifeTime.ToString() & " seconds" _
            ) _
        )
        sw.WriteLine( _
            "BatteryFullLifeTime: " & _
            IIf( _
                .BatteryFullLifeTime = -1, _
                "Unknown", _
                .BatteryFullLifeTime.ToString() & " seconds" _
            ) _
        )
    End With
    MsgBox(sw.ToString())
Else

    ' An error occured.
End If