编辑:亚当完全正确,我误解了这个问题,所以我删除了我原来的答案。
要监控用户活动,您可以创建一个自定义的基于Form 的类,您的应用程序表单将从该类继承。在那里您可以订阅 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。