Уровень заряда батареи на ноутбуке

Как узнать уровень заряда батареи на ноутбуке? Да, довольно просто!

На помощь приходит API функция - GetSystemPowerStatus

С помощью данной функции, можно определить:

  • уровень заряда аккумулятора (батареи в ноутбуке или ИБП)
  • подключен ли к сети:
    • 0 - не подключен к сети
    • 1 - подключен к сети
    • 255 - неизвестно
  • заряд батареи (высокий, нормальный, низкий и т.д)
  • время работы от батареи
  • максимальное время работы от батареи

battery Уровень заряда батареи на ноутбуке

На форму, киньте только ListBox.

Public Class Form1
    WithEvents Tmr As Timer = New Timer
    Dim SPSInfo As SYSTEM_POWER_STATUS
    Public Sub New()
        ' Этот вызов необходим конструктору форм Windows.
        InitializeComponent()
        Tmr.Interval = 1000 ' интервал 1 секунда
        AddHandler Tmr.Tick, AddressOf Tmr_Tick ' добавляем обработчик события
        Tmr.Start()
    End Sub
    Private Declare Auto Function GetSystemPowerStatus Lib "kernel32.dll" ( _
          ByRef lpSystemPowerStatus As SYSTEM_POWER_STATUS) _
      As Integer
    Public Structure SYSTEM_POWER_STATUS
        Public ACLineStatus As Byte ' подключение к сети
        Public BatteryFlag As BatteryFlag ' состояние батареи - заряд батареи
        Public BatteryLifePercent As Byte ' оставшийся ресурс батареи - уровень заряда(в процентах)
        Public Reserved1 As Byte ' заразервированно
        Public BatteryLifeTime As Integer ' оставшиеся время работы (в секундах)
        Public BatteryFullLifeTime As Integer ' полное время работы батареи
    End Structure
    Public Enum BatteryFlag As Byte
        Высокий = 1
        Нормальный = 0
        Низкий = 2
        Критический = 4
        Заряжается = 8 ' иногда проскакивают и другие значения
        БатареяОтсутствует = 128
        Неизвестно = 255
    End Enum
    Sub Tmr_Tick()
        ListBox1.Items.Clear() ' очищаем
        GetSystemPowerStatus(SPSInfo)
        ' питание
        If SPSInfo.ACLineStatus Then
            ListBox1.Items.Add("Питание от сети")
        ElseIf SPSInfo.ACLineStatus = 0 Then
            ListBox1.Items.Add("Питание от батареи")
        Else
            ListBox1.Items.Add("Питание: неизвестно")
        End If
        ListBox1.Items.Add("Уровень заряда: " & SPSInfo.BatteryLifePercent & "%") ' уровень заряда
        ListBox1.Items.Add("Заряд батареи: " & SPSInfo.BatteryFlag.ToString) ' заряд батареи
        ' оставшиеся время работы от батареи [timespan в помощь.] 
        Dim h As Integer, m As Integer
        m = SPSInfo.BatteryLifeTime / 60 ' min
        If m < 60 Then
            ListBox1.Items.Add("Осталось " & m & " мин")
        Else
            h = Math.Round(m / 60) ' hours
            m = m - (h * 60) ' min 
            ListBox1.Items.Add("Осталось " & h & " ч. " & m & " мин")
        End If
    End Sub
End Class

Так выглядит информация, когда ноутбук заряжается от БП:

battery network Уровень заряда батареи на ноутбуке

при зарядке, время не показывается.

Загрузить проект

Скоро напишу данный пример на C# ! Ждите :]

  Метки: , , , , , ,
  Евгений
  Просмотров: 13 515
  Запись опубликована в 07:55

3 комментария

  • Анимацию еще бы сделать 8)

  • Ну в Visual C# самое сложное понять как объявить...

    using System.Runtime.InteropServices;

    Внутри класса:
    [DllImport("kernel32")]
    public static extern int GetSystemPowerStatus(ref SYSTEM_POWER_STATUS lpSystemPowerStatus);
    public struct SYSTEM_POWER_STATUS
    {
    public byte ACLineStatus; // подключение к сети
    public byte BatteryFlag; // состояние батареи - заряд батареи
    public byte BatteryLifePercent; // оставшийся ресурс батареи - уровень заряда(в процентах)
    public byte Reserved1; // заразервированно
    public int BatteryLifeTime; // оставшиеся время работы (в секундах)
    public int BatteryFullLifeTime; // полное время работы батареи
    }

    Ну с Public Enum BatteryFlag я не стал запариваться..))

    Использование (без задания значения SPSInfo редактор ругается):
    SYSTEM_POWER_STATUS SPSInfo;
    SPSInfo.ACLineStatus = 1;// подключение к сети
    SPSInfo.BatteryFlag = 1;// состояние батареи - заряд батареи
    /* Высокий = 1 Нормальный = 0 Низкий = 2
    Критический = 4 Заряжается = 8 ' иногда проскакивают и другие значения
    БатареяОтсутствует = 128 Неизвестно = 255 */
    SPSInfo.BatteryLifePercent = 1;// оставшийся ресурс батареи - уровень заряда(в процентах)
    SPSInfo.Reserved1 = 1;// заразервированно
    SPSInfo.BatteryLifeTime = 1;// оставшиеся время работы (в секундах)
    SPSInfo.BatteryFullLifeTime = 1;// полное время работы батареи
    GetSystemPowerStatus(ref SPSInfo);

    • Если хотите, можете написать статью и приложить проект!?) Стоит только зарегистрироваться, я дам права и все 8)

Есть что сказать? Тогда действуй!