設定によっては、電源の状態によって、Windowsパソコンのパフォーマンスが落ちることがあります。
そこで、WindowsパソコンがAC電源で動作しているのか、バッテリで動作しているのかを判定して、処理を変更したいことがあります。
電源状態を取得するのは、APIのGetSystemPowerStatus関数を使用します。
GetSystemPowerStatus関数
GetSystemPowerStatus関数は、以下のシステムの電源状態を取得する事が出来ます。
- AC 電源と DC 電源のどちらで動作しているか?
- バッテリーが現在充電されているか?
- バッテリーの寿命がどれくらい残っているか?
- バッテリー 節約機能がオンかオフか?
ヘッダファイル
C++Builderで、GetSystemPowerStatus関数を使用するには、C++Builder(Rad Studio)をインストールしたフォルダのインクルードファイルフォルダの以下の場所の「winbase.h」をインクルードします。
include\windows\sdk\の中の winbase.h をインクルードします。
プロトタイプ宣言
プロトタイプ宣言は、以下の通りです。
BOOL
WINAPI
GetSystemPowerStatus(
_Out_ LPSYSTEM_POWER_STATUS lpSystemPowerStatus
);
SYSTEM_POWER_STATUS構造体
GetSystemPowerStatus関数の引数に使用する、SYSTEM_POWER_STATUS構造体です。
typedef struct _SYSTEM_POWER_STATUS {
BYTE ACLineStatus;
BYTE BatteryFlag;
BYTE BatteryLifePercent;
BYTE SystemStatusFlag;
DWORD BatteryLifeTime;
DWORD BatteryFullLifeTime;
} SYSTEM_POWER_STATUS, *LPSYSTEM_POWER_STATUS;
定義
GetSystemPowerStatus関数で、使用する定義です。
#define AC_LINE_OFFLINE 0x00
#define AC_LINE_ONLINE 0x01
#define AC_LINE_BACKUP_POWER 0x02
#define AC_LINE_UNKNOWN 0xFF
#define BATTERY_FLAG_HIGH 0x01
#define BATTERY_FLAG_LOW 0x02
#define BATTERY_FLAG_CRITICAL 0x04
#define BATTERY_FLAG_CHARGING 0x08
#define BATTERY_FLAG_NO_BATTERY 0x80
#define BATTERY_FLAG_UNKNOWN 0xFF
#define BATTERY_PERCENTAGE_UNKNOWN 0xFF
#define SYSTEM_STATUS_FLAG_POWER_SAVING_ON 0x01
#define BATTERY_LIFE_UNKNOWN 0xFFFFFFFF
サンプルコード
GetSystemPowerStatus関数を使用して、AC電源、バッテリ(DC電源)のどちらを使用しているかをチェックする関数です。バッテリ(DC電源)を使用している時は、trueを返します。
int CheckUsebattery(void)
{
SYSTEM_POWER_STATUS powerStatus;
int ret = false;
if (GetSystemPowerStatus(&powerStatus))
{
switch(powerStatus.ACLineStatus)
{
case AC_LINE_OFFLINE:
// ShowMessage("AC_LINE_OFFLINE");
break;
case AC_LINE_ONLINE:
ret = true;
// ShowMessage("AC_LINE_ONLINE");
break;
case AC_LINE_BACKUP_POWER:
// ShowMessage("AC_LINE_BACKUP_POWER");
break;
case AC_LINE_UNKNOWN:
// ShowMessage("AC_LINE_UNKNOWN");
break;
default:
// ShowMessage("????");
break;
}
} else {
// ShowMessage("バッテリ情報を取得できませんでした");
return false;
}
return ret;
}
参考URL
以下のHPも参考にしてください。