【问题标题】:WinRT - how to tell if device is on battery or wall powered?WinRT - 如何判断设备是电池供电还是墙壁供电?
【发布时间】:2013-10-06 23:36:53
【问题描述】:

假设我想定制我的应用程序以在使用电池供电时限制吞吐量,但在将其插入墙上插座时会全力以赴。

是否有一个事件可以插入以检测这些事情何时发生,例如检测到互联网连接时?

【问题讨论】:

标签: windows-runtime microsoft-metro windows-applications


【解决方案1】:

显然有这个trigger 可以插入。它仅在设备插入时才会触发。

【讨论】:

    【解决方案2】:

    IE和WebViewhttp://ie.microsoft.com/testdrive/HTML5/PowerMeter/Default.html可以轮询cpu电源状态 例如:http://apps.microsoft.com/windows/app/plugged-in/2b91b1e1-9e30-4a96-bc95-b196e46bef9d 在 c#/xaml 中尝试:

    XAML

    <WebView x:Name="BatteryCheck_WV" Source="ms-appx-web:///Assets/JSBatteryCheck.html" Height="50" Width="50" Visibility="Collapsed"    />
    

    c#

    var PeriodicTimer = ThreadPoolTimer.CreatePeriodicTimer(async (timer) =>
                {
                    await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Low,
                    async () =>
                    {
                        if (Window.Current.Visible) BatteryStatus.IsOn= Convert.ToBoolean(await BatteryCheck_WV.InvokeScriptAsync("IsPluggedIn", null));
    
                    });
                }, new TimeSpan(0, 0, 0, 1, 0));
    

    html/js

    <!DOCTYPE html>
    <html>
    <head>
        <title>JSBatteryCheck</title>
        <script type="text/javascript">
    
            var batterytimeOut;
            var timeOutGo = true;
            var lastDisplayUpdateTime = new Date();
            var MilliSeconds = 1000;
            var displayUpdateInterval = 200;
            var values = [];
            var maxValues = displayUpdateInterval;
    
            var PluggedIn = true;
            var currentTicksPerMilliSecond = 0;
    
            function GetTicksPerSecond() {
                if ((new Date() - lastDisplayUpdateTime) >= displayUpdateInterval) {
                    lastDisplayUpdateTime = new Date;
                    currentTicksPerMilliSecond = Avg();
                    values = [];
                    if (!isNaN(currentTicksPerMilliSecond)) {
    
                        PluggedIn = (currentTicksPerMilliSecond > 9) ? false : true;
                    }
                }
                else Tick();
    
                if (timeOutGo) batterytimeOut = setTimeout(function () { GetTicksPerSecond() }, 1);
            }
    
            function StartTimer() {
                timeOutGo = true;
                GetTicksPerSecond();
                return "";
            }
    
            function Tick() {
                if (values.length > maxValues) values.shift();
                else values.push(new Date());
            }
    
            function Avg() {
                if (values.length > 1) {
                    var earliest = values[0];
                    var latest = values[values.length - 1];
                    var elapsed = latest - earliest;
                    var elapsedSeconds = elapsed / MilliSeconds;
                    var avg = MilliSeconds / ((values.length - 1) / elapsedSeconds);
                    return parseInt(avg);
                }
                else return NaN;
            }
    
            function StopTimeOut() {
                clearTimeout(batterytimeOut);
                batterytimeOut = null;
                timeOutGo = false;
            }
    
    
            function IsPluggedIn() {
                return String(PluggedIn);
            }
    
        </script>
    </head>
    <body onload="GetTicksPerSecond()">
        <div id="PowerStatus"></div>
        <button onclick="StopTimeOut()">Stop timeout</button>
    </body>
    </html>
    

    对于后台任务 SystemTriggerType.BackgroundWorkCostChange 事件是最好的,但需要锁屏访问

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-26
      相关资源
      最近更新 更多