我有一个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.
| 归档时间: |
|
| 查看次数: |
13740 次 |
| 最近记录: |