1

Windows 8 ストア アプリ API を使用して、アプリ内またはシステム全体でユーザーが非アクティブであった時間を検出しようとしています。

システム トリガーの User Away を調べますが、アイドル状態になると通知されます。特定の時間を指定することはできません。Pointer Pressed も調べて、タップまたはタッチ イベントを検出しようとしました。しかし、私は webview を使用しており、web ビューを介して PointerPressed イベントをキャプチャできないため、これは機能しません。

ユーザーがアプリ内またはシステム全体で X 時間アイドル状態になっているかどうかを検出する方法はありますか? どんな助けでも大歓迎です、ありがとう!

4

1 に答える 1

0

javascriptでキープレスとマウスダウンイベントを検出することになりました。LoadCompleted イベント内で、AW_WebView.InvokeScript("eval", new string[] { scriptsString }); を使用して JavaScript を挿入します。

キープレススクリプト:

window.document.body.onkeydown = function(event){ 
            window.external.notify('key_pressed');              
         };

マウス ダウン スクリプト:

document.onmousedown = function documentMouseDown(e){
         window.external.notify('mouse_down');
    }

また、追加のユーザー イベント用にスクリプトを追加することもできます。

マウス ダウンまたはキー プレスが検出されると、window.external.notify("keypress or mouse down") が実行されます。このメッセージは、WebView_ScriptNotify イベントで「受信」されます。WebView からメッセージを受信したら、タイマーを設定します。タイマーが既に設定されている場合は、それをキャンセルして、タイマーを再度開始します。タイマーが終了すると、いくつかのコードが実行されます。

private void SetTimer(int time)
        {
            if (!TimerEnabled)
            {
                return;
            }
            else
            {
                if (DelayTimer != null)
                {
                    DelayTimer.Cancel();
                    DelayTimer = null;
                }

                //the timeout 
                TimeSpan delay = TimeSpan.FromSeconds(time);

                bool completed = false;

                DelayTimer = ThreadPoolTimer.CreateTimer(
                    (source) =>
                    {    
                        // 
                        // Update the UI thread by using the UI core dispatcher.
                        // 
                        Dispatcher.RunAsync(
                                 CoreDispatcherPriority.High,
                                 () =>
                                 {
                                     // 
                                     // UI components can be accessed within this scope.
                                    //THIS CODE GETS EXECUTED WHEN TIMER HAS FINISHED

                                 });

                        completed = true;
                    },
                    delay,
                    (source) =>
                    {
                        // 
                        // TODO: Handle work cancellation/completion.
                        // 


                        // 
                        // Update the UI thread by using the UI core dispatcher.
                        // 
                        Dispatcher.RunAsync(
                            CoreDispatcherPriority.High,
                            () =>
                            {
                                // 
                                // UI components can be accessed within this scope.
                                // 

                                if (completed)
                                {
                                    // Timer completed.
                                }
                                else
                                {
                                    // Timer cancelled.
                                }

                            });
                    });
            }
        }

これが誰かを助けることを願っています! これがこれを行うための完璧な方法ではないことはわかっていますが、当面はこれでうまくいきました。

于 2013-07-09T21:19:58.353 に答える