在平板/笔记本中,我们经常要基于主机是否在充电来做一些事情。比如当主机在充电时,需要通知外接键盘,键盘可以亮背景灯了;如果主机没充电,也要立即通知键盘,要键盘关闭背景等。
我们可以通过 ManagementEventWatcher 来创建一个电源监听事件解决这个问题,当事件到达时,再通过 GetSystemPowerStatus 来获取充电如否就可以了。大体代码如下:
// 判断是否正在充电的 API
[DllImport(@"kernel32.dll")] extern public static bool GetSystemPowerStatus(out PowerStatus batteryInfo);
// 定义监听事件代理
public delegate void DelegatePowerChanged(bool isPowerOn, int batteryLife);
public DelegatePowerChanged OnPowerChanged;
/// <summary>
/// 定义全局的对象,用于监听电源事件
/// </summary>
private System.Management.ManagementEventWatcher _localWatcher = null;
/// <summary>
/// 开始监听
/// </summary>
public void Start()
{
if (_localWatcher != null) { return; }
System.Management.WqlEventQuery query = new System.Management.WqlEventQuery("Win32_PowerManagementEvent");
_localWatcher = new System.Management.ManagementEventWatcher(query);
_localWatcher.EventArrived += new System.Management.EventArrivedEventHandler(MyEventHandler);
_localWatcher.Start();
}
/// <summary>
/// 监听事件到达
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void MyEventHandler(Object sender, EventArrivedEventArgs e)
{
if (OnPowerChanged == null) { return; }
GetPowerStatus(out bool isPowerOn, out int batteryLife);
OnPowerChanged(isPowerOn, batteryLife);
}
public static void GetPowerStatus(out bool isPowerOn, out int batteryLife)
{
isPowerOn = false;
batteryLife = 0;
PowerStatus ps = default(PowerStatus);
if (GetSystemPowerStatus(out ps))
{
isPowerOn = ps.ACLineStatus == 1;
batteryLife = ps.BatteryLifePercent;
}
}