내가 가지고 접근 방식은 P/호출하고 난 PowerStatus라는 클래스를 생성하도록 장치의 PowerStatus을 확인 : 내 "장치"클래스에서 다음
public enum ACLineStatus { Offline = 0, Online = 1, Unknown = 255 }
[Flags]
public enum BatteryStatus { High = 1, Low = 2, Critical = 4, Charging = 8, NoSystemBattery = 128, Unknown =-1 }
public class PowerStatus
{
private struct _SYSTEM_POWER_STATUS_EX
{
public byte ACLineStatus;
public byte BatteryFlag;
public byte BatteryLifePercent;
public byte Reserved1;
public uint BatteryLifeTime;
public uint BatteryFullLifeTime;
public byte Reserved2;
public byte BackupBatteryFlag;
public byte BackupBatteryLifePercent;
public byte Reserved3;
public uint BackupBatteryLifeTime;
public uint BackupBatteryFullLifeTime;
}
[DllImport("coredll")]
private static extern uint GetSystemPowerStatusEx(ref _SYSTEM_POWER_STATUS_EX lpSystemPowerStatus,
bool fUpdate);
public ACLineStatus ACLineStatus { get; set; }
public BatteryStatus BatteryStatus { get; set; }
public byte? BatteryLifePercent { get; set; }
public TimeSpan? BatteryLifeTime { get; set; }
public TimeSpan? BatteryFullLifeTime { get; set; }
public BatteryStatus BackupBatteryStatus { get; set; }
public byte? BackupBatteryLifePercent { get; set; }
public TimeSpan? BackupBatteryLifeTime { get; set; }
public TimeSpan? BackupBatteryFullLifeTime { get; set; }
private PowerStatus()
{
}
public static PowerStatus GetCurrent()
{
_SYSTEM_POWER_STATUS_EX powerStatus = new _SYSTEM_POWER_STATUS_EX();
GetSystemPowerStatusEx(ref powerStatus, true);
return new PowerStatus
{
ACLineStatus = (ACLineStatus)powerStatus.ACLineStatus,
BatteryStatus = (BatteryStatus)powerStatus.BatteryFlag,
BatteryLifePercent = powerStatus.BatteryLifePercent.Between((byte)0, (byte)100) ? (byte?)powerStatus.BatteryLifePercent : null,
BatteryLifeTime = powerStatus.BatteryLifeTime >= 0 ? new TimeSpan(0, 0, (int)powerStatus.BatteryLifeTime) as TimeSpan? : null,
BatteryFullLifeTime = powerStatus.BatteryFullLifeTime >= 0 ? new TimeSpan(0, 0, (int)powerStatus.BatteryFullLifeTime) as TimeSpan? : null,
BackupBatteryStatus = (BatteryStatus)powerStatus.BackupBatteryFlag,
BackupBatteryLifePercent = powerStatus.BackupBatteryLifePercent.Between((byte)0, (byte)100) ? (byte?)powerStatus.BackupBatteryLifePercent : null,
BackupBatteryLifeTime = powerStatus.BackupBatteryLifeTime >= 0 ? new TimeSpan(0, 0, (int)powerStatus.BackupBatteryLifeTime) as TimeSpan? : null,
BackupBatteryFullLifeTime = powerStatus.BackupBatteryFullLifeTime >= 0 ? new TimeSpan(0, 0, (int)powerStatus.BackupBatteryFullLifeTime) as TimeSpan? : null
};
}
}
와 내가 타이머를 가지고있는 장치가 PowerStatus.GetCurrent은()는 당신이 필요로하는 모든 아마
public static event EventHandler DeviceDocked;
private static ACLineStatus _lastPowerState = PowerStatus.GetCurrent().ACLineStatus;
private static void timer_Tick(object state)
{
ACLineStatus powerState = PowerStatus.GetCurrent().ACLineStatus;
_timer.Change(Timeout.Infinite, Timeout.Infinite);
if (powerState == ACLineStatus.Online && _lastPowerState == ACLineStatus.Offline)
{
var e = DeviceDocked;
if (e != null)
{
e(null, EventArgs.Empty);
}
}
_lastPowerState = powerState;
_timer.Change(1000, Timeout.Infinite);
}
그건 도킹 이벤트를 발생시킵니다 .. 난이 도움이 되었으면 좋겠 :)