0

我们需要能够在手持设备上运行的应用程序中确定该设备已返回到底座。

虽然一种方法可能是观察电池充电水平是否增加,但这种方法确实是一种解决方法,如果电池处于 100% 充电状态,则会失败。

我们未能成功搜索 EMD 帮助文件。

4

1 回答 1

0

我采用的方法是 P/Invoke 并检查设备的 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
        };
    }
}

然后在我的“设备”类中,我有一个计时器,它在设备停靠时触发一个事件

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);
    }

PowerStatus.GetCurrent()可能就是你所需要的。我希望这会有所帮助:)

于 2016-10-05T10:43:21.700 回答