VarSetCapacity(电源状态, 1+1+1+1+4+4)
success :=DllCall("kernel32.dll\GetSystemPowerStatus","uint",&电源状态)

ToolTip,% 电源状态.BatteryFlag

交流电源状态:=ReadInteger(&电源状态,0,1,false)
电池充电状态:=ReadInteger(&电源状态,1,1,false)
剩余电量:=ReadInteger(&电源状态,2,1,false)
可用时间:=ReadInteger(&电源状态,4,4,false)
充满时间:=ReadInteger(&电源状态,8,4,false)

输出结果:="交流电源状态: " 交流电源状态 "`n电池充电状态: " 电池充电状态 "`n剩余电量(百分比): " 剩余电量 "`n电池剩余电量(剩余秒): " TimesFormat(可用时间//100000) "`n充满电需要时间(剩余秒): " TimesFormat(充满时间//100000)
MsgBox, %输出结果%
return

TimesFormat(Times) {
  RegExMatch(Times,"^(\d+)(\.(\d+))*$",t)
  Return Format("{:02}时{:02}分{:02}秒{:03}毫秒", t1//3600, Mod(t1,3600)//60, Mod(Mod(t1,3600),60), !t2 ? 000 : t3)
}

ReadInteger( 指针地址, 指针偏移, 字节长度, p_hex=true )
{
  value = 0
  old_FormatInteger := a_FormatInteger ;备份format格式
  if ( p_hex )
    SetFormat, integer, hex
  else
    SetFormat, integer, dec
  loop, %字节长度%
    value := value+( *( ( 指针地址+指针偏移 )+( a_Index-1 ) ) << ( 8* ( a_Index-1 ) ) )
  SetFormat, integer, %old_FormatInteger% ;还原format格式
  return, value
}

esc::ExitApp
/*
ACLineStatus  交流电源状态
Value	Meaning
0 Offline
1 Online
255 Unknown status

BatteryFlag  电池充电状态。 可以包含一或多个以下值
Value	Meaning
1 高,电量大于66%
2 低,小于33%
4 极低,小于5%
8 充电中
128 没有电池
255 未知,无法读取状态

BatteryLifePercent   电池还有百分之几能充满.0~100,若未知则为255
Reserved1   保留,必须为0
BatteryLifeTime   秒为单位的电池剩余电量, 若未知则为-1
BatteryFullLifeTime   秒为单位的电池充满电的电量,若未知则为-1

; 获取剩余电量
VarSetCapacity(SYSTEM_POWER_STATUS, 12, 0)
DllCall("GetSystemPowerStatus", "Ptr", &SYSTEM_POWER_STATUS)
BatteryLifePercent := NumGet(SYSTEM_POWER_STATUS, 2, "UChar") ; 0-100 剩余电量 255 状态未知

*/

 

声明:站内资源为整理优化好的代码上传分享与学习研究,如果是开源代码基本都会标明出处,方便大家扩展学习路径。请不要恶意搬运,破坏站长辛苦整理维护的劳动成果。本站为爱好者分享站点,所有内容不作为商业行为。如若本站上传内容侵犯了原著者的合法权益,请联系我们进行删除下架。