C#:是否 Windows.Devices.Power.Battery.ReportUpdate 说明计算机是否已插入并限制事件

C#: Does Windows.Devices.Power.Battery.ReportUpdate state if computer is plugged in, and limiting events

我希望在计算机已拔下电源并且 运行 使用电池时得到通知。一旦使用电池,我想知道电池百分比何时达到 25%。我更喜欢一个事件,但如有必要可以进行投票。

有多种方法可以检查计算机是否已接通电源或使用电池。 您可以投票查看:

System.Windows.SystemParameters.PowerLineStatus == System.Windows.PowerLineStatus.Offline;

var batteryPercentage == SystemInformation.PowerStatus.BatteryLifePercent;

除了必须进行投票外,我看不出有任何缺点。

您还可以使用 Windows.Devices.Power.Battery.AggregateBattery.ReportUpdated 中的事件 ReportUpdate。这似乎非常接近我想要的。从这里你可以得到 BatteryStatus Enum.

可能性是充电、放电、空闲和不存在。我的猜测是 Charging 或 Idle 必然意味着笔记本电脑已插入电源,而 Discharging 则意味着它仅使用电池。 但这只是我的猜测!文档中没有任何地方这样说。我可以想象你可能有一个非常糟糕的电池,即使它已插入,它仍在放电。我如何确定它已插入?

另外,活动实在是太多了。当它插入并充电并且电池百分比上升时,我真的不想要一个事件。我真的只关心它被拔掉,一旦它被拔掉,达到 25%。我想如果没有太多事件我可以忽略不必要的信息。 有没有办法减少或选择事件,或者没有太多我应该忽略这个?

I really only care about it being unplugged, and once it's unplugged, getting to 25%

请检查Get battery information,一旦你有聚合电池对象,调用GetReport得到相应的BatteryReport

The Battery object triggers the ReportUpdated event when charge, capacity, or status of the battery changes. This typically happens immediately for status changes and periodically for all other changes.

Battery.AggregateBattery.ReportUpdated += AggregateBattery_ReportUpdated;

async private void AggregateBattery_ReportUpdated(Battery sender, object args)
{
    if (reportRequested)
    {

        await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
        {
            // Clear UI
            BatteryReportPanel.Children.Clear();


            if (AggregateButton.IsChecked == true)
            {
                // Request aggregate battery report
                RequestAggregateBatteryReport();
            }
            else
            {
                // Request individual battery report
                RequestIndividualBatteryReports();
            }
        });
    }
}

如果您只是想检测它是否已拔下并达到 25%。你可以用一个方法打包上面的代码。

例如:

public static class BatteryUnpluggedTo25
{
    private static Action<bool> _action;
    public static void Report(Action<bool> action)
    {
        Battery.AggregateBattery.ReportUpdated += AggregateBattery_ReportUpdated;
        _action = action;
    }

    private static void AggregateBattery_ReportUpdated(Battery sender, object args)
    {
        var aggBattery = Battery.AggregateBattery;
        var report = aggBattery.GetReport();
        switch (report.Status)
        {
            case Windows.System.Power.BatteryStatus.NotPresent:
                break;
            case Windows.System.Power.BatteryStatus.Discharging:
                currentBatteryLevel(report, _action);
                break;
            case Windows.System.Power.BatteryStatus.Idle:
                break;
            case Windows.System.Power.BatteryStatus.Charging:

                break;
            default:
                break;
        }
    }
    private  static void currentBatteryLevel(BatteryReport report, Action<bool> action)
    {

        var Maximum = Convert.ToDouble(report.FullChargeCapacityInMilliwattHours);
        var Value = Convert.ToDouble(report.RemainingCapacityInMilliwattHours);
        var level = Value / Maximum;

        if (level <= 0.25)
        {
            action(true);
        }

    }
}

用法

BatteryUnpluggedTo25.Report((s) =>
{

    if (s == true)
    {
      // do something
    }
});