经过大量的谷歌搜索和花费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);
};
}
答案 0 :(得分:1)
如果您的问题是,"是否有更好的方法来实现会话超时?" - 然后我会说,可能 - 我就是这样做的。
会话超时可以执行以下两种操作之一。它可以像街机游戏一样工作,你有一个超时的时间来完成你的任务。或者,如果没有任何反应,它可以监控不活动状态并关闭。
无论哪种方式,我都会将此功能包装到会话提供程序中 - 假设MVVM是目标,我使用提供程序来引用某种服务或数据源。
提供程序被实例化为单例,因此在整个应用程序生命周期中作为一个实例存在。我通常通过在app.xaml中创建它来管理它。然后,我使用消息框架(如MVVM light)与提供程序进行交互。
创建后,提供程序管理一个线程,该线程检查日期时间以查看它是否发生在过去。如果是,它会在事件或消息上发出会话。您的应用程序会选择此消息以关闭或等等。
如果您需要有限的时间段或时间,则可以实施一条启动消息,根据您要运行的时间跨度将监控的日期时间设置为将来的某个时间点。如果您想要一个不活动注销,那么您可以从您认为合适的任何用户交互中发送此消息,以防止注销,例如输入更改或ICommand执行。
我进一步采取了这个步骤,因此我的提供商也发出了一个“结束”的结果。在超时完成前几秒发出消息,这样我就可以显示警告 - 但希望你能得到一般的想法。
如果这听起来像你之后的那样,那么我会添加一些例子,但是到目前为止这还不是你所要求的。