Считывание состояния батареи ноутбука в режиме с плавающей точкой / с двойным стеком

#c #winapi #power-management

#c #winapi #управление питанием

Вопрос:

У меня есть программа, которая считывает состояние батареи в Windows, которая выглядит следующим образом (упрощенный код):

 #include <iostream>
#include <windows.h>

using namespace std;

int main(int argc, char *argv[]) {
    SYSTEM_POWER_STATUS spsPwr;
    if( GetSystemPowerStatus(amp;spsPwr) ) {
        cout << "nAC Status : " << static_cast<double>(spsPwr.ACLineStatus)
             << "nBattery Status : " << static_cast<double>(spsPwr.BatteryFlag)
             << "nBattery Life % : " << static_cast<double>(spsPwr.BatteryLifePercent)
             << endl;
        return 0;
    } else return 1;
}
  

spsPwr.BatteryLifePercent содержит оставшийся заряд батареи в процентах и имеет тип BYTE , что означает, что он может отображать показания только в круглых числах (т.Е. int ). Я заметил, что приложение под названием BatteryBar может отображать процент заряда батареи в значении с плавающей запятой.

BatteryBar — это приложение .NET. Как я могу получить процентное значение заряда батареи в float / double, используя чистый C / C с Windows API? (Предпочтительнее решение, которое может быть скомпилировано с помощью MinGW)

Комментарии:

1. Вы имеете в виду, что хотите большей точности? Или вы имеете в виду, что хотите, чтобы срок службы батареи был равен 1?

2. Пожалуйста, загрузите это изображение правильно, используя инструменты Stack Overflow для публикации; изображение, на которое вы разместили ссылку, не может быть подключено по горячей ссылке.

3. @Tomalak: я хочу получить показания, которые показывают десятичное значение (например, 22,5, 87,5). И мне не разрешено публиковать изображение из-за моей репутации.

4. Тогда, по крайней мере, опубликуйте URL-адрес, который работает.

Ответ №1:

Вы можете получить эту информацию с помощью WMI . попробуйте использовать BatteryFullChargedCapacity BatteryStatus классы и, оба являются частью rootWMI пространства имен.

Чтобы получить оставшийся заряд батареи в процентах, просто необходимо использовать свойства RemainingCapacity (BatteryStatus) и FullChargedCapacity (BatteryFullChargedCapacity).

Оставшийся заряд батареи в процентах равен

(Остаточная емкость * 100) / Полная зарядная емкость

например, если свойство FullChargedCapacity сообщает 5266 значение, а свойство RemainingCapacity сообщает a 5039 , повторное использование будет 95,68932776 %

Если вы не знаете, как получить доступ к WMI из C , прочитайте эти статьи

Ответ №2:

Ну, как вы сказали, Windows API предоставляет только целочисленное процентное значение. И, как вы подразумевали, .NET предоставляет значение с плавающей запятой.

Это означает, что для использования с плавающей запятой вы должны использовать .NET. Тем не менее, .ЧИСТОЕ значение находится между 0.0 и 1.0 , и из документации неясно, действительно ли вы получаете большую точность.

Ответ №3:

В инструменте указано, что он выполняет «Статистическое прогнозирование времени«, поэтому я сомневаюсь, что он использует прямое значение SYSTEM_POWER_STATUS .

Лично я с трудом представляю, для чего была бы полезна точность с плавающей запятой, но в любом случае вы могли бы использовать ILSpy, чтобы посмотреть, как они это делают, или, может быть, вы также могли бы спросить их, как они это делают.

Ответ №4:

Версия .NET на самом деле не обеспечивает большей точности. Он просто делит значение BatterLifePercent байта на 100,0 и возвращает результат. Вот содержимое getter в .NET.

 public float BatteryLifePercent
{
    get
    {
        this.UpdateSystemPowerStatus();
        float num = ((float) this.systemPowerStatus.BatteryLifePercent) / 100f;
        if (num <= 1f)
        {
            return num;
        }
        return 1f;
    }
}
  

UpdateSystemPowerStatus() вызывает WINAPI GetSystemPowerStatus() , который, в свою очередь, обновляется systemPowerStatus .