Мне потребовалась процедура VBA , чтобы получить текущий уровень заряда батареи и состояние зарядки системы .
Я был удивлен, что ничего не нашел в переполнении стека, иВ конце концов я понял это, поэтому я поделюсь кодом здесь как Q + A.
Option Explicit Private Declare Function GetSystemPowerStatus Lib "kernel32" (lpSystemPowerStatus As SYSTEM_POWER_STATUS) As Long Private Type SYSTEM_POWER_STATUS ACLineStatus As Byte BatteryFlag As Byte BatteryLifePercent As Byte SystemStatusFlag As Byte BatteryLifeTime As Long BatteryFullLifeTime As Long End Type Public Sub getBatteryStatus() 'prints current battery status to immediate window Dim SPS As SYSTEM_POWER_STATUS GetSystemPowerStatus SPS 'get system battery power status With SPS Debug.Print "Battery Life: ", ; Select Case .BatteryLifePercent Case 255: Debug.Print "Unknown" Case Else: Debug.Print .BatteryLifePercent & "%" End Select Debug.Print "Battery Life Time: ", ; Select Case .BatteryLifeTime Case -1: Debug.Print "Charging" Case Else Debug.Print Int(.BatteryLifeTime / 60) & "min / "; Select Case .BatteryFullLifeTime Case -1 If .BatteryLifePercent = 0 Then Debug.Print "Unknown" Else 'estimate FullLifeTime: Debug.Print "~" & Int(.BatteryLifeTime / .BatteryLifePercent * 5 / 3) & "min" End If Case Else Debug.Print .BatteryFullLifeTime & "sec" End Select End Select Debug.Print "AC power status: ", ; Select Case .ACLineStatus 'show some information Case 0: Debug.Print "Offline" Case 1: Debug.Print "OnLine" Case Else: Debug.Print "Unknown" End Select Debug.Print "Battery charge status: ", ; Select Case .BatteryFlag Case 0: Debug.Print "Not Charging (33-66%)" Case 1: Debug.Print "High (>66%)" Case 2: Debug.Print "Low (<33%)" Case 4: Debug.Print "Critical (<5%)" Case 8: Debug.Print "Charging" Case 1 + 8: Debug.Print "High (>66%)- Charging" Case 2 + 8: Debug.Print "Low (<33%) - Charging" Case 4 + 8: Debug.Print "Critical (<5%) - Charging" Case 128: Debug.Print "No System Battery" Case 255: Debug.Print "Unknown Status" End Select Debug.Print "Battery saver: ", ; Select Case .SystemStatusFlag Case 0: Debug.Print "Off" Case 1: Debug.Print "On (Save energy where possible)" 'Windows 10 only End Select End With End Sub