作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 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/
我是一名优秀的程序员,十分优秀!