最近项目需求,在WPF中,为了便于追踪用户操作,要求用户一定时间没有操作时,自动锁定系统或自动注销当前用户登录。
思路:在B/S项目中,使用Session能够很容易实现这个功能,但是在C/S的WPF项目需要自己想办法了。想到一个办法就是实时监视鼠标的位置,如果在指定时间内,鼠标位置没有改变,那么就认为用户离开了,没有操作,就可以注销用户登录了。
根据这个思路,首先得需要获得鼠标的位置,使用系统API来获得。
[StructLayout(LayoutKind.Sequential)]
public struct POINT
{
public int X;
public int Y;
public POINT(int x, int y)
{
this.X = x;
this.Y = y;
}
}
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern bool GetCursorPos(out POINT lpPoint);
第二,定义两个变量,记录鼠标位置和时间。
POINT curPoint = new POINT();
DateTime curTime = DateTime.Now;
第三,监视鼠标位置是否改变,这里我用了Task,异步另起一个线程里面监视,鼠标位置:
GetCursorPos(out curPoint);
Task.Factory.StartNew(() =>
{
while (true)
{
POINT tmpPoint = new POINT();
GetCursorPos(out tmpPoint);
if (tmpPoint.X != curPoint.X || tmpPoint.Y != curPoint.Y)
{
curPoint = tmpPoint;
curTime = DateTime.Now;
}
else
{
//检查是否超过5分钟
if (curTime.AddMinutes(5) < DateTime.Now)
{
break;
}
}
}
this.Dispatcher.Invoke(new Action(() => {
//调用注销方法
logout();
}));
});