广东珠海网站建设,wordpress 判断手机端,做前端常用的网站及软件,生成前端页面的网站思路 在WPF应用程序中实现长时间未操作自动退出#xff0c;主要思路是先收集用户操作行为#xff0c;用一个全局变量记录用户最后操作时间#xff0c;再用一个异步线程去监控用户的最后操作时间和当前时间进行比较如果超过了设定时间认为长时间未操作自动退出登录并显示相关…思路 在WPF应用程序中实现长时间未操作自动退出主要思路是先收集用户操作行为用一个全局变量记录用户最后操作时间再用一个异步线程去监控用户的最后操作时间和当前时间进行比较如果超过了设定时间认为长时间未操作自动退出登录并显示相关日志消息。 有一个问题自动退出后当前停留的界面功能是否还有权限使用呀这个问题要怎么解决大家可以自己去想想我是解决了。如果想和我交流可以在评论区讨论。
收集用户操作行为 我想到了两种方式 一、在所有按钮或功能中调用一个公共方法记录用户的操作行为。优点实现简单不足如果系统功能多且在系统要完工时加这个功能那工作量不少哦代码改动面也大可能改出其他BUG。 二、可以通过监听用户的鼠标和键盘事件来实现。优点改动小工作量小。不足有点难没事有我呢。我来分享。我用的就是这种方法
监听用户的鼠标和键盘事件来实现 在主窗口如MainWindow中设置一个计时器如DispatcherTimer。 当用户进行鼠标或键盘操作时判断是否超时没有超时更新用户最后操作时间否则调用自动退出方法。 如果计时器到达设定的时间且没有其他操作事件触发则调用自动退出方法。
示例代码
/// summary
/// MainWindow.xaml 的交互逻辑
/// /summary
public partial class MainWindow : System.Windows.Window
{/// summary
/// 刷新时间
/// /summary
private readonly DispatcherTimer _timerwatchpermit new DispatcherTimer();public MainWindow(){InitializeComponent();this.MouseMove MainWindow_MouseMove;this.KeyDown MainWindow_KeyDown;this.Loaded MainWindow_Loaded;}/// summary/// 键盘按下事件/// /summary/// param namesender/param/// param namee/param/// exception crefNotImplementedException/exceptionprivate void MainWindow_KeyDown(object sender, KeyEventArgs e){userOperationLastTimeMonitoringAndUpdate();}/// summary/// 鼠标移动事件/// /summary/// param namesender/param/// param namee/param/// exception crefNotImplementedException/exceptionprivate void MainWindow_MouseMove(object sender, MouseEventArgs e){userOperationLastTimeMonitoringAndUpdate();}/// summary/// 用户操作时间监控和更新/// /summaryprivate void userOperationLastTimeMonitoringAndUpdate(){if (Global.UserOperationLastTime ! SystemConst.DateTimeDefault !Global.user_permit.Equals(操作员)){//检查是否超过指定分钟数验证SystemConfigConst.UserOperationMaxMinute是配置的超时时间if (DateTime.Now Global.UserOperationLastTime.AddMinutes(SystemConfigConst.UserOperationMaxMinute)){//超过了自动退出登录Global.UserLogOut(true);}else{Global.UserOperationLastTime DateTime.Now;}}}private void MainWindow_Loaded(object sender, RoutedEventArgs e){//Log_Msg.Foreground Brushes.Wheat;//#AAFFFFFFLog_Msg.Foreground new SolidColorBrush((Color)ColorConverter.ConvertFromString(#AAFFFFFF));Log_Alm.Foreground Log_Msg.Foreground;Log_SocketMsg.Foreground Log_Msg.Foreground;Log_SendNeedleLog.Foreground Log_Msg.Foreground;Log_MonitoringMsg.Foreground Log_Msg.Foreground;cboIsCurrentXY.Foreground Log_Msg.Foreground;_timerwatchpermit.Interval new TimeSpan(0, 0, 0, 1, 0);_timerwatchpermit.Tick Tmr_sacn_Tick;_timerwatchpermit.Start();}private void Tmr_sacn_Tick(object sender, EventArgs e)
{try{//CurrentTime DateTime.Now;//MessageHelper.ShowMsg(当前时间: CurrentTime.ToString(yyyy-MM-dd HH:mm:ss), Tmr_sacn_Tick);if (Global.UserOperationLastTime ! SystemConst.DateTimeDefault !Global.user_permit.Equals(操作员))
{//检查是否超过指定分钟数验证if (DateTime.Now Global.UserOperationLastTime.AddMinutes(SystemConfigConst.UserOperationMaxMinute)){//超过了自动退出登录Global.UserLogOut(true);}
}}catch (Exception ex){MessageHelper.ShowMsgError(_className .Tmr_sacn_Tick 方法异常- ex, _className .Tmr_sacn_Tick);}
}
}
当用户的鼠标移动或按下键盘键时会触发MouseMove或KeyDown事件并调用 userOperationLastTimeMonitoringAndUpdate();。如果在设置内没有任何事件被触发计时器会完成并调用Global.UserLogOut(true)方法来退出登录。