Редактировать : Адам абсолютно прав, я неправильно понял вопрос, поэтому я удалил свой первоначальный ответ.
Чтобы отслеживать активность пользователей, вы можете создать пользовательский класс 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
}
Надеюсь, это поможет.
Edit # 2 : перефразировал некоторые части объяснения для ясности и изменил использование события FormClosing на FormClosed.