WinRT 定时注销

本文关键字:注销 定时 WinRT | 更新日期: 2023-09-27 18:32:00

我正在开发一个WinRT应用程序。其中一个要求是应用程序应具有"定时注销"功能。这意味着在任何屏幕上,如果应用程序已空闲 10 分钟,应用程序应注销并导航回主屏幕。

执行此操作的蛮力方法显然是在每个页面的每个网格上挂接指针按下的事件,并在触发任何这些事件时重置计时器,但我想知道是否有更优雅、更可靠的方法做到这一点。

谢谢拉吉夫

WinRT 定时注销

通过使用DispatcherTimer和几个事件,你可以实现这一目标。

DispatcherTimer Timer;
private void InitializeTimer()
{
    Dispatcher.AcceleratorKeyActivated += Dispatcher_AcceleratorKeyActivated;
    Window.Current.CoreWindow.PointerMoved += CoreWindow_PointerMoved;
    Window.Current.CoreWindow.PointerPressed += CoreWindow_PointerPressed;
    Timer = new DispatcherTimer();
    Timer.Interval = TimeSpan.FromMinutes(10);
    Timer.Tick += Timer_Tick;
    Timer.Start();
}
private void CoreWindow_PointerPressed(CoreWindow sender, PointerEventArgs args)
{
    Timer.Start();
}
private void CoreWindow_PointerMoved(CoreWindow sender, PointerEventArgs args)
{
    Timer.Start();
}
private void Dispatcher_AcceleratorKeyActivated(CoreDispatcher sender, AcceleratorKeyEventArgs args)
{
    Timer.Start();
}
private void Timer_Tick(object sender, object e)
{
    Timer.Stop();
    //TODO: Do logout.
}
我不知道内置

的任何内容,但是与其附加到Grid等,我建议您将事件处理程序附加到当前CoreWindow(文档)中,用于需要跟踪以确定空闲状态的各种类型的事件。

例如,如果您确实附加到Grid,您会发现使用 Popup 的控件不会触发事件。例如,事件处理程序不会跟踪ComboBox

例如,您可以执行以下操作:

var core = CoreWindow.GetForCurrentThread();
core.KeyDown += (sender, kdArgs) => { 
    // reset timeout
};
core.PointerMoved = core.PointerMoved = (sender, pmArgs) {
   // reset timeout (maybe with a bit of logic to prevent tiny mouse drift from
   // causing false positives
}; 
// etc. (whatever else makes sense)

代码依赖于GetForCurrentThread调用(文档),该调用(文档)返回作为所有内容的主机的 CoreWindow 实例。