项目背景
在某个客户端项目,客户要求应用在没有相关输入n分钟后,自动锁定应用(注意不是直接锁系统)。
实现方式
1.监听系统空闲事件:使用 SystemEvents 类的 SessionSwitch 事件来监听系统空闲事件,当用户离开或锁定计算机时触发锁屏,这个是针对系统级的锁屏,不适合需求,故排除。
2.使用Windows API:通过调用Windows API GetLastInputInfo函数获取自上次用户输入以来经过的时间,再结合应用最后一次的输入时间来判定。
具体实现
1.通过系统api获取最近用户的输入以来的空闲时间,idleTime=GetIdleTime()
using System;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential)]
struct LASTINPUTINFO
{
public uint cbSize;
public uint dwTime;
}
[DllImport("user32.dll")]
private static extern bool GetLastInputInfo(ref LASTINPUTINFO plii);
private static uint GetIdleTime()
{
LASTINPUTINFO lastInputInfo = new LASTINPUTINFO();
lastInputInfo.cbSize = (uint)Marshal.SizeOf(lastInputInfo);
GetLastInputInfo(ref lastInputInfo);
return ((uint)Environment.TickCount - lastInputInfo.dwTime);
}
- 定义一个属性记录应用外设的最后人工输入时间点。加入是lastManualInputTime。
3.定义一个定时器,每隔1s检测一下是否达到配置的空闲等待最长时间(如:timeout=300s),若超过应用自动锁定,否则不做任何处理。
int idleTime=GetIdleTime(); //获取系统空闲时间
int lastManualInputTime=xxxx; //计算应用外设最后输入的空闲时间
int timeout=300;
//取2个时间的最小值,与超时时间对比
if(min(idleTime,lastManualInputTime)>300){
//TODO 应用锁定
}else{
//不做任何处理
}