프로그램 개발중 현재 시스템의 배터리 상태를 얻고 싶을 때가 있습니다.
이때는 System.Windows.Forms.SystemInformation.PowerStatus을 사용하시면 됩니다.
MSDN 내용은 다음의 링크를 참조해 주세요.
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;
}
}
'C#' 카테고리의 다른 글
[C# / WinUI3] User Control에서 Property 및 Event 추가 (0) | 2023.08.28 |
---|---|
win32 API로 디스플레이 확장/복제 설정하기 (0) | 2023.04.17 |
[C#.NET] C# 에서 C++ Windows Runtime Component 사용하기 (0) | 2022.12.02 |
[C# .NET] COM 통신 (4) | 2022.09.21 |