Чтение состояния батареи ноутбука в режиме Float / Double - PullRequest
5 голосов
/ 16 октября 2011

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

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

using namespace std;

int main(int argc, char *argv[]) {
    SYSTEM_POWER_STATUS spsPwr;
    if( GetSystemPowerStatus(&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, является предпочтительным)

Ответы [ 4 ]

3 голосов
/ 16 октября 2011

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

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

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

(RemainingCapacity * 100) / FullChargedCapacity

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

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

1 голос
/ 16 октября 2011

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

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

0 голосов
/ 16 октября 2011

.NET-версия на самом деле не дает вам больше точности.Он просто делит байтовое значение BatterLifePercent на 100.0 и возвращает результат.Вот содержимое метода получения в .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.

0 голосов
/ 16 октября 2011

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

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

...