#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
.