int sess_creation_time = now(); * 假设'now()'函数返回当前unix时间戳
**2.nd:**当用户尝试执行任何操作时,捕获此尝试的时间戳。
int temp_time = now(); 现在,只需将这些值与所需的自动注销限制进行比较。
// compare here
// a, temp_time - sess_creation_time => the difference, time of inactivity
// 60*30 -> 60 seconds * 30 -> 30 minutes
if( (temp_time - sess_creation_time) > (60*30) )
{
// time of inactivity is higher than allowed, logout here
logout();
}
else
{
// session is still valid, do not forget to update its creation time
sess_creation_time = now();
}
4条答案
按热度按时间5f0d552i1#
编辑:Adam是完全正确的,我误解了这个问题,所以我删除了原来的答案。
若要监视用户活动,可以创建一个基于Form的自定义类,应用程序窗体将从该类继承。在该类中,可以订阅MouseMove和KeyDown事件(将KeyPreview属性设置为true),只要用户处于活动状态,就会引发这两个事件中的任何一个。然后,您可以创建System.Threading.Timer,将到期时间设置为30分钟,并在检测到用户活动时使用Change()方法将其推迟。
下面是一个示例实现:ObservedForm编写得相当一般,这样您可以更容易地看到模式。
现在,您可以订阅UserActivity事件,并执行所需的逻辑,例如:
希望这对你有帮助。
编辑#2:为了清楚起见,重新表述了说明的某些部分,并将FormClosing事件的用法更改为FormClosed。
olhwl3o22#
这是解决这个问题的最简单的方法,效果很好。
syqv5f0l3#
你必须为你所有的表单创建一个基类,它将拦截任何用户活动并存储最后一次活动的时间。每次用户点击某个东西时,你都必须检查最后一次活动的日期,并决定它是否是太久以前的。
目前我不知道如何拦截,但我很肯定这是可能的(也许使用windows消息?)
kdfy810k4#
**1.st:**用户登录,将时间戳存储在某处(例如,此unix时间戳“1294230230”表示大约为2011年1月5日12:24)
int sess_creation_time = now();
* 假设'now()'函数返回当前unix时间戳**2.nd:**当用户尝试执行任何操作时,捕获此尝试的时间戳。
int temp_time = now();
现在,只需将这些值与所需的自动注销限制进行比较。
**不要忘记,这不是用C/C++或C#编写的,但逻辑保持不变;- )
Hope,这对你有点帮助**