2016-09-26 22 views
0

핸드 헬드 장치에서 실행중인 응용 프로그램에서 장치를 크래들에 반환했는지 확인할 수 있어야합니다.Motorola MC55 MC67 MC67이 크래들에 있음을 프로그래밍 방식으로 확인하는 방법

배터리 충전 수준이 올라가는 지 관찰하는 한 가지 방법이 있지만이 방법은 실제로 해결 방법이며 배터리가 100 % 충전 된 경우에는 실패합니다.

EMD 도움말 파일을 성공적으로 검색하지 못했습니다.

답변

0

내가 가지고 접근 방식은 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); 
    } 

그건 도킹 이벤트를 발생시킵니다 .. 난이 도움이 되었으면 좋겠 :)