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

Ibr*_*GUN 2 c# winforms

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

Shd*_*dNx 11

编辑:亚当是完全正确的,我误解了这个问题,所以我删除了原来的答案.

要监视用户活动,您可以创建一个自定义的基于表单的类,您的应用程序表单将从该类继承.在那里,您可以订阅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;
     }
}
Run Code Online (Sandbox Code Playgroud)

现在,您可以订阅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
}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.

编辑#2:为了清晰起见,重新描述了解释的某些部分,并将FormClosing事件的使用更改为FormClosed.