winform应用自动锁定

101 阅读1分钟

 项目背景

在某个客户端项目,客户要求应用在没有相关输入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);
}

    

  1. 定义一个属性记录应用外设的最后人工输入时间点。加入是lastManualInputTime。

3.定义一个定时器,每隔1s检测一下是否达到配置的空闲等待最长时间(如:timeout=300s),若超过应用自动锁定,否则不做任何处理。

int idleTime=GetIdleTime();  //获取系统空闲时间
int lastManualInputTime=xxxx; //计算应用外设最后输入的空闲时间
int timeout=300;
//取2个时间的最小值,与超时时间对比
if(min(idleTime,lastManualInputTime)>300){
    //TODO 应用锁定
}else{
    //不做任何处理
}