3

经过大量谷歌搜索并花费 4 小时,我想这是找到用户不活动和锁定屏幕的最佳方法。

public MainWindow()
    {
        InitializeComponent();
        var timer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(10) };
        timer.Tick += delegate
        {
            timer.Stop();
            MessageBox.Show("Logoff trigger");
            timer.Start();
        };
        timer.Start();
        InputManager.Current.PostProcessInput += delegate(object s, ProcessInputEventArgs r)
        {
            if (r.StagingItem.Input is MouseButtonEventArgs || r.StagingItem.Input is KeyEventArgs)
                timer.Interval = TimeSpan.FromSeconds(10);
        };
    }
4

1 回答 1

1

如果您的问题是“是否有更好的方法来实现会话超时?” - 那么我会说,可能 - 我就是这样做的。

会话超时可以做两件事之一。它可以像街机游戏一样工作,您可以在其中完成任务的超时时间。或者它可以监视不活动并在没有任何反应时关闭。

无论哪种方式,我都会将此功能包装到会话提供程序中 - 假设 MVVM 是目标,我使用提供程序来引用某种服务或数据源。

提供者被实例化为单例,因此在整个应用程序生命周期中作为一个实例存在。我通常通过在 app.xaml 中创建它来管理它。然后,我使用消息框架(例如 MVVM light)与提供者交互。

一旦创建,提供者将管理一个线程,该线程检查日期时间以查看它是否发生在过去。如果确实如此,它会通过事件或消息发出会话。您的应用程序会收到此消息以关闭或其他任何内容。

如果您想要一个有限的时间段或时间,您可以实现一条开始消息,根据您要运行的时间跨度将监控的日期时间设置为未来的某个点。如果您想要退出非活动状态,那么您可以从您认为合适的任何用户交互中发送此消息,以防止退出,例如输入更改或 ICommand 执行。

我更进一步,所以我的提供商也会在超时完成前几秒钟发出“结束”消息,这样我就可以显示警告 - 但希望你能得到大致的想法。

如果这听起来像您所追求的,那么我将添加一些示例,但到目前为止还没有,以防这不是您所要求的。

于 2014-08-27T06:11:54.270 回答