본문 바로가기
C#

[C#.NET] Laptop Battery 정보 얻기 (Power Status)

by 달나라외계인 2022. 9. 26.

프로그램 개발중 현재 시스템의 배터리 상태를 얻고 싶을 때가 있습니다.

이때는 System.Windows.Forms.SystemInformation.PowerStatus을 사용하시면 됩니다.

 

MSDN 내용은 다음의 링크를 참조해 주세요.

MSDN PowerStatus 

 

SystemInformation.PowerStatus Property (System.Windows.Forms)

Gets the current system power status.

learn.microsoft.com

제일 먼저 다음을 선언합니다.

using System.Windows.Forms;

 

그리고 SystemInformation.PowerStatus에서 BatteryChargeStatus 값을 확인하면 배터리의 현재 충전 상태를 알아낼 수 있습니다. 배터리의 현재 상태는 enum BatteryChargeStatus으로 관리되며 다음과 같은 총 4가지의 중첩가능한 일반 상태와 2가지 특수 상태로 표시됩니다.

일반 상태 High 배터리 충전상태가 높습니다.
Low 배터리 충전상태가 낮습니다.
Critical 배터리 충전상태가 매우 낮습니다.
Charging 배터리가 충전중입니다.
특수 상태 NoSystemBattery 배터리가 존재하지 않습니다.
Unknown 배터리의 상태를 알 수 없습니다.

 

다음과 같이 해당 Flag를 가지는지 확인해 보면 충전중 여부를 알 수 있습니다.

var status = SystemInformation.PowerStatus;

if (status.BatteryChargeStatus.HasFlag(BatteryChargeStatus.Charging))
{
	MessageBox.Show("충전중");
}

 

배터리의 양을 알고 싶을 때는 PowerStatus의 다음의 속성 값을 이용하시면 됩니다.

속성명 출력 내영
BatteryLifePercent float (0.0 ~ 1.0) 남은 배터리 양을 리턴합니다.
BatteryFullLifetime int (초) 배터리 완충시 기대 충전 수명을 리턴합니다.
BatteryLifeRemaining int (초) 남은 배터리의 기대 시간을 리턴합니다.

 

var status = SystemInformation.PowerStatus;
var life = status.BatteryLifePercent;

MessageBox.Show($"배터리가 {life * 100}% 남았습니다.");

if (status.BatteryLifeRemaining >= 0)
{
	MessageBox.Show($"배터리 기대 사용시간은 {status.BatteryLifeRemaining}초 입니다.");
}

 

   참고 하자면 BatteryFullLifetime 과 BatteryLifeRemaining이 -1인 경우에는 상태를 알 수 없는 경우라는 것입니다. 이 내용은 배터리 충전 후 경과 시간에 따른 배터리 소모량으로 계산되기 때문에 배터리 사용 후 충분한 시간이 경과되지 않았거나 계산할 수 없다면 -1을 리턴합니다. 이 시간은 배터리 사용 초반부에는 생각보다 값이 리턴이 되지 않거나 일부 노트북에서는 값이 영 나오지 않아서 저 같은 경우에는 그냥 다음과 같이 BatteryLifePercent가 변화했을 때 걸렸던 시간에 따라 변화하는 양을 이용해 대충이라도 계산해서 표시하게 하였었습니다. 부끄러운 코드니 참고만 해주시고 (^^;) 배터리 시간이 항상 리턴되지는 않는다 정도로 이해하시면 좋겠습니다.

 

DateTime previousLifeCheck = DateTime.Now;  // 이전 배터리 수명 측정시간
int previouseEtimateLifeRemaining = 0;  // 이전 배터리 수명 추정값
float previousLifePercent = -1F;    // 이전 배터리량
...

var status = SystemInformation.PowerStatus;

var life = status.BatteryLifePercent;
var isCharging = status.BatteryChargeStatus.HasFlag(BatteryChargeStatus.Charging);
var lifeRemaining = status.BatteryLifeRemaining;

if (isCharging || lifeRemaining >= 0)
{
    // 시스템으로부터 남은 시간 측정값을 받았거나 배터리를 충전하기 시작했다
    // 기존 배터리 추정치 정보들은 클리어 해주자

    previouseEtimateLifeRemaining = -1;
    previousLifePercent = -1;
}
else
{
    // 배터리 소모량으로 대충이라도 계산해서 보여주자
    lifeRemaining = previouseEtimateLifeRemaining;

    var currentTime = DateTime.Now;

    if (previousLifePercent < 0)
    {
        // 이전 배터리 상태에 대한 정보가 없다. 지금 정보를 넣어주자
        previousLifePercent = life;
        previousLifeCheck = currentTime;
    }

    var diffBattery = previousLifePercent - life;

    if (diffBattery >= 0.02F)
    {
        // 2% 이상 배터리 차이를 보였을 때 시간을 계산한다
        // 너무 체크를 작게 하면 오차가 너무 커질 수 있을 것 같아서
        var timespan = currentTime - previousLifeCheck;

        lifeRemaining = (int)(timespan.TotalSeconds * life / diffBattery);

        previouseEtimateLifeRemaining = lifeRemaining;
        previousLifePercent = life;
        previousLifeCheck = currentTime;
    }
}

 

마지막으로 파워 케이블이 연결되어 있는지 여부는 PowerStatus의 PowerLineStatus을 사용하면 됩니다.

Offline 케이블이 연결되어 있지 않습니다.
Online 케이블이 연결되어 있습니다.
Unkown 현재 상태를 알 수 없습니다.

 

다음은 케이블 연결될 때까지 기다리다가 연결 후 메시지를 띄우는 예제 코드입니다.

 

var status = SystemInformation.PowerStatus;

while (true)
{
	if (status.PowerLineStatus == PowerLineStatus.Online)
	{
    	MessageBox.Show("케이블이 연결되었습니다.");
        break;
    }
}