2024/06/03 電子書籍「電子書籍出版・技術文書作成を劇的に加速!秀丸エディタ + Markdown + Pandocの驚異」を出版

電源状態を取得するには

C++Builder

設定によっては、電源の状態によって、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も参考にしてください。

タイトルとURLをコピーしました