c# - 如何在 Windows 窗体应用程序中触发自动注销?

标签 c# winforms

我有一个 Windows 应用程序项目,用户可以使用他们的用户 ID 和密码登录。我想让它在用户登录时获得登录时间,如果用户 30 分钟未使用该应用程序,应用程序将再次将用户发送到登录屏幕。我怎样才能做到这一点?

最佳答案

编辑:Adam 完全正确,我误解了问题,所以我删除了原来的答案。

要监控用户事件,您可以创建自定义 Form -based 类,您的申请表将从中继承。您可以在那里订阅 MouseMove 和 KeyDown 事件(将 KeyPreview 属性设置为 true),只要用户处于事件状态,就会引发这两个事件。然后您可以创建一个 System.Threading.Timer ,到期时间设置为 30 分钟,并在检测到用户事件时使用 Change() 方法推迟。

这是下面的示例实现:ObservedForm 编写得相当通用,因此您可以更容易地看到模式。

public class ObservedForm : Form
{
     public event EventHandler UserActivity;

     public ObservedForm()
     {
         KeyPreview = true;

         FormClosed += ObservedForm_FormClosed;
         MouseMove += ObservedForm_MouseMove;
         KeyDown += ObservedForm_KeyDown;
     }

     protected virtual void OnUserActivity(EventArgs e)
     {
         var ua = UserActivity;
         if(ua != null)
         {
              ua(this, e);
         }
     }

     private void ObservedForm_MouseMove(object sender, MouseEventArgs e)
     {
          OnUserActivity();
     }

     private void ObservedForm_KeyDown(object sender, KeyEventArgs e)
     {
          OnUserActivity();
     }

     private void ObservedForm_FormClosed(object sender, FormClosedEventArgs e)
     {
         FormClosed -= ObservedForm_FormClosed;
         MouseMove -= ObservedForm_MouseMove;
         KeyDown -= ObservedForm_KeyDown;
     }
}

现在您可以订阅 UserActivity 事件,并执行您想要的逻辑,例如:

private System.Threading.Timer timer = new Timer(_TimerTick, null, 1000 * 30 * 60, Timeout.Infinite);
private void _OnUserActivity(object sender, EventArgs e)
{
     if(timer != null)
     {
         // postpone auto-logout by 30 minutes
         timer.Change(1000 * 30 * 60, Timeout.Infinite);
     }
}

private void _TimerTick(object state)
{
    // the user has been inactive for 30 minutes; log him out
}

希望这对您有所帮助。

编辑 #2:为了清楚起见,重新措辞了部分解释,并将 FormClosing 事件的使用更改为 FormClosed。

关于c# - 如何在 Windows 窗体应用程序中触发自动注销?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4603374/

相关文章:

c# - 在单个方法调用中改变对犀牛模拟的期望

c# - 打开 "known file type"进入自定义应用程序的运行实例 - .NET

c# - 在 SilverLight 网页中保存数据

c# - C#中的单击和双击事件不起作用

c# - 如何启用窗体上的所有控件?

c# - EF 4.0 实体属性 setter 抛出 ArgumentOutRangeException

c# - 单声道不支持 UDP 协议(protocol)?

c# - 如何隐藏 SplitContainer 上的面板?

c# - 如何在WFA中将数据添加到BoxPlot?

c# - 尝试从另一个文本框更新一个文本框,反之亦然 C# Winforms