power_info.hsp

sample\win32_gen2\power_info.hsp » Plain Format

;
; power_info.hsp - 電源情報 (バッテリ / AC 接続 / スリープ残時間) 表示
; Win32 API gen2 サンプル (hsp3net 必須)
;
; 使い方:
;   hsp3net から実行する。GetSystemPowerStatus (kernel32) で
;   SYSTEM_POWER_STATUS 構造体を取得し、AC 接続状態 / バッテリ残量 /
;   残稼働時間を表示する。CallNtPowerInformation (powrprof) で
;   SystemPowerInformation を取得する例も添える。
;
; 動作確認:
;   デスクトップ PC なら
;     AC: Online / Battery: no battery / Percent: ---
;   ノート PC なら
;     AC: Online (充電中) / Battery: Charging / Percent: 78%
;   のような表示になる。
;
; 備考:
;   - SYSTEM_POWER_STATUS は BYTE×4 + DWORD×2 (計 12 バイト) で、gen2 の
;     NSTRUCT 定義では int×6 扱いになっておりパッキングが一致しないため、
;     本サンプルでは生バッファ (int×3 = 12 バイト) を使い peek / lpeek で
;     各フィールドを取り出す。
;

#include "win32_types_gen2.as"
#include "kernel32_gen2.as"
#include "powrprof_gen2.as"

    ; --- GetSystemPowerStatus ---
    dim sps, 3    ; 12 バイト (BYTE×4 + DWORD×2)
    ret = GetSystemPowerStatus(sps)
    if ret = 0 {
        mes "GetSystemPowerStatus 失敗"
        end
    }

    ac_line        = peek(sps, 0)   ; 0=offline, 1=online, 255=unknown
    battery_flag   = peek(sps, 1)   ; bit: 1=high, 2=low, 4=critical, 8=charging, 128=no battery, 255=unknown
    battery_pct    = peek(sps, 2)   ; 0-100, 255=unknown
    life_time      = lpeek(sps, 4)  ; 秒, -1=unknown
    full_life_time = lpeek(sps, 8)  ; 秒, -1=unknown

    mes "=== SYSTEM_POWER_STATUS ==="

    ; AC
    switch ac_line
    case 0 : mes "AC LineStatus  : Offline (バッテリ駆動)" : swbreak
    case 1 : mes "AC LineStatus  : Online (AC 接続中)"     : swbreak
    case 255 : mes "AC LineStatus  : Unknown" : swbreak
    default : mes "AC LineStatus  : " + ac_line
    swend

    ; Battery flag
    if battery_flag = 255 {
        mes "Battery Flag   : Unknown"
    } else : if battery_flag = 128 {
        mes "Battery Flag   : バッテリ非搭載"
    } else {
        s = ""
        if battery_flag & 1   : s += "High "
        if battery_flag & 2   : s += "Low "
        if battery_flag & 4   : s += "Critical "
        if battery_flag & 8   : s += "Charging "
        if s = "" : s = "Normal "
        mes "Battery Flag   : " + s + "(0x" + strf("%02X", battery_flag) + ")"
    }

    ; Percent
    if battery_pct = 255 {
        mes "Battery Percent: ---"
    } else {
        mes "Battery Percent: " + battery_pct + "%"
    }

    ; Life time
    if life_time = -1 {
        mes "Remaining Time : ---"
    } else {
        mes "Remaining Time : " + life_time + " 秒 (" + (life_time / 60) + " 分)"
    }
    if full_life_time = -1 {
        mes "Full Life Time : ---"
    } else {
        mes "Full Life Time : " + full_life_time + " 秒"
    }

    mes ""
    mes "=== CallNtPowerInformation (SystemPowerInformation) ==="

    ; CallNtPowerInformation の引数は gen2 では intptr, int, intptr, int の
    ; ポインタ引数が intptr 型 (スカラ) で宣言されているので、
    ; バッファのアドレスを varptr() で渡す。
    ; SystemPowerInformation (level=12) の OutputBuffer は SYSTEM_POWER_INFORMATION
    ; 構造体 (16 バイト程度: DWORD×4)。
    dim spi, 4   ; 16 バイト
    status = CallNtPowerInformation(12, 0, 0, varptr(spi), 16)
    if status = 0 {
        mes "MaxIdlenessAllowed    : " + spi(0)
        mes "Idleness              : " + spi(1)
        mes "TimeRemaining         : " + spi(2)
        mes "CoolingMode           : " + spi(3)
    } else {
        mes "CallNtPowerInformation 失敗 status=0x" + strf("%08X", status)
    }

    stop