利用win32的GetLastInputInfo函数实现锁屏(C#)

前两天看到群里面讨论这个问题,刚好我们上一家公司的系统也有这个功能,就研究了一下,我们这边实现这个功能的目的如下:当用户长时间不操作系统时,自动退出系统并退回到登录界面,想要使用系统,就得重新输入账号和密码。

下面是网上搜集到的资料:

https://www.cnblogs.com/riasky/p/3459030.html  (检测鼠标的位置及焦点事件)

C#全局监听键盘事件_c#监听键盘输入_木已初夏的博客-CSDN博客  (使用钩子函数)

测试环境:

visual studio 2017

.net framework 3.5

操作步骤如下:

1  新建winform项目,项目名称为:LockScreen

2  新建名为LockScreenManager的操作类,并编辑如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;namespace LockScreen
{public class LockScreenManager{/// <summary>/// 获取上一次输入的时间/// </summary>/// <param name="plii">false为获取失败</param>/// <returns></returns>[DllImport("user32.dll")]private static extern bool GetLastInputInfo(ref LastInputInfo plii);/// <summary>/// 获取当前操作系统的时刻计数/// </summary>/// <returns></returns>[DllImport("kernel32.dll")]private static extern ulong GetTickCount64();public static ulong GetLastInputTime(){LastInputInfo lastInputInfo = default(LastInputInfo);lastInputInfo.cbSize = Marshal.SizeOf(lastInputInfo);bool flag = !GetLastInputInfo(ref lastInputInfo);ulong result;if (flag){result = 0UL;}else{//获取当前操作系统的时刻计数ulong currentOsTickCount = 0;try{currentOsTickCount=GetTickCount64();}catch (Exception){currentOsTickCount = (ulong)((long)Environment.TickCount);}//获取最后一个输入事件时的时刻计数ulong lastInputEventTickCount = (ulong)lastInputInfo.dwTime;ulong gapTickCount = currentOsTickCount - lastInputEventTickCount;ulong gapSeconds = gapTickCount / 1000UL;bool flag2 = gapSeconds > 86400UL;if (flag2){result = 0UL;}else{result = gapSeconds;}}return result;}}public struct LastInputInfo{/// <summary>/// 结构的大小/// </summary>[MarshalAs(UnmanagedType.U4)]public int cbSize;/// <summary>/// 收到最后一个输入事件时的时刻计数/// </summary>[MarshalAs(UnmanagedType.U4)]public uint dwTime;}}

3  把默认的窗体名称修改为:FrmMain,最后界面如下图:

4  新建名为LockScreenWindow的锁屏窗体,最后效果如下图:

4  编辑FrmMain.cs如下图:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;namespace LockScreen
{public partial class FrmMain : Form{int unlock = 0;//锁屏秒数ulong lockScreenSecond = 10;public FrmMain(){InitializeComponent();Timer timer = new Timer();timer.Interval = 1000;timer.Tick += Timer_Tick;timer.Start();}private void Timer_Tick(object sender, EventArgs e){var lastInputTime=LockScreenManager.GetLastInputTime();Console.WriteLine("输出值:"+lastInputTime);if (lastInputTime > lockScreenSecond){if(System.Threading.Interlocked.Exchange(ref unlock,1)==0){LockScreenWindow lockScreenWindow = new LockScreenWindow();lockScreenWindow.ShowDialog();System.Threading.Interlocked.Exchange(ref unlock, 0);}}}}
}

上述代码启用了一个定时器,定时1秒,其中lockScreenSecond是锁屏的秒数,即超过lockScreenSecond秒都没操作电脑就弹出锁屏界面

5  运行效果如下图:

运行程序后,不做任何操作等待10秒左右弹出锁屏界面

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/126606.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

react官网

应急方案 – React 中文文档 (docschina.org) 正版卡死版 Hooks FAQ – React (reactjs.org) 英文流畅版 应急方案 – React 中文网 (nodejs.cn) 盗版流畅版&#xff08;翻译有稍稍的问题&#xff09; http://www.react-cn.com/index.html 黄版

【数据结构】数组和字符串(十三):链式字符串的基本操作(串长统计、查找、复制、插入、删除、串拼接)

文章目录 4.3 字符串4.3.1 字符串的定义与存储4.3.2 字符串的基本操作&#xff08;链式存储&#xff09;1. 结构体2. 初始化3. 判空4. 串尾添加5. 打印6. 串长统计7. 查找8. 复制9. 插入10. 删除11. 串拼接12. 销毁13. 主函数14. 代码整合 4.3 字符串 字符串(String)是由零个或…

Latex排版SIGGRAPH总结(持续总结中...)

本文学习总结自&#xff1a;How to use the ACM SIGGRAPH / TOG LaTeX template 相关文件&#xff1a;百度网盘 首先解压 “my paper” 中的文件&#xff0c;并用Latex打开mypaper.tex. 多行连等公式 \begin{equation}表示编号公式&#xff0c;\[ \]表示无编号公式 无编号\b…

go-zero数据库连接池 database/sql 源码学习

database/sql 中接口的层级关系https://draveness.me/golang/docs/part4-advanced/ch09-stdlib/golang-database-sql/ database/sql源码地址&#xff1a;https://github.com/golang/go/tree/release-branch.go1.17/src/database/sql go-zero数据库连接池源码地址 https://githu…

k8s中 RBAC中,clusterrole,serviceaccount , rolebinding 是什么关系谁先谁后

在Kubernetes的RBAC&#xff08;Role-Based Access Control&#xff09;中&#xff0c;ClusterRole、ServiceAccount和RoleBinding是三个关键的组件&#xff0c;它们之间的关系如下&#xff1a; ClusterRole&#xff1a;ClusterRole 是一种全局的权限规则&#xff0c;它定义了一…

ESP32网络开发实例-使用密码登录Web服务器

使用密码登录Web服务器 文章目录 使用密码登录Web服务器1、软件准备2、硬件准备3、代码实现在本文中,我们将使用 ESP32 和 Arduino IDE 设计一个受密码保护的 Web 服务器。 如果您使用 ESP32 制作了家庭自动化项目并且您正在访问 Web 服务器上的所有信息,并且您希望通过添加密…

JavaScript 中闭包是什么?有哪些应用场景?

给大家推荐一个实用面试题库 1、前端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;web前端面试题库 闭包是什么&#xff1f; 闭包是指一个函数可以访问并操作其词法作用域外的变量的能力。闭包就是能够读取其他函数内…

双轮差速模型机器人通过线速度、角速度计算机器人位姿

已知上一时刻机器人位置P_OLD (x,y,),机器人当前时刻的线速度和角速度&#xff08;v,&#xff09;,短时间内t内&#xff0c;机器人在线性部分和非线性部分的增量为 线性部分&#xff1a; 非线性部分&#xff1a; 由于可能非常小&#xff0c;导致非线性部分数值不稳定&#xf…

【R统计】各式各样的插补法解决数据缺失的问题!

&#x1f482; 个人信息&#xff1a;酷在前行&#x1f44d; 版权: 博文由【酷在前行】原创、需要转载请联系博主&#x1f440; 如果博文对您有帮助&#xff0c;欢迎点赞、关注、收藏 订阅专栏&#x1f516; 本文收录于【R统计】&#xff0c;该专栏主要介绍R语言实现统计分析的…

【计算机视觉】对极几何

文章目录 一、极线约束&#xff08;Epipolar Constraint&#xff09;二、相机标定过的情况三、相机没有标定过的情况四、八点算法&#xff08;eight-point algorithm&#xff09; 我的《计算机视觉》系列参考UC Berkeley的CS180课程&#xff0c;PPT可以在课程主页看到。 在上一…

关于preempt count的疑问

Linux中的preempt_count - 知乎 https://www.cnblogs.com/hellokitty2/p/15652312.html LWN&#xff1a;关于preempt_count()的四个小讨论&#xff01;-CSDN博客 主要是参考这些文章 之前一直认为只要是in_interrupt()返回非0值&#xff0c;那么就可以认为当前在中断上下文。即…

模拟官网编写自定义Grafana Dashboard

前言 我们想编写自定义的Dashboard&#xff0c;类似于官网那样下载的Dashboard&#xff0c;并且能移值到机器主机&#xff0c;如何实现了&#xff1f; ## 官网dashboard https://grafana.com/grafana/dashboards/ 编写 先在虚拟机写好Dashboard 然后下载。json文件如下: {…

阿昌教你如何优雅的数据脱敏

阿昌教你如何优雅的数据脱敏 Hi&#xff0c;我是阿昌&#xff0c;最近有一个数据脱敏的需求&#xff0c;要求用户可自定义配置数据权限&#xff0c;并对某种类型数据进行脱敏返回给前端 一、涉及知识点 SpringMVCJava反射Java自定义注解Java枚举 二、方案选择 1、需求要求…

Webpack打包图片-js-vue

文章目录 一、Webpack打包图片1.加载图片资源的准备2.认识asset module type3.asset module type的使用4.url-loader的limit效果 二、babel1.为什么需要babel2.babel命令行的使用3.babel插件的使用4.babel的预设preset5.babel-loader6.babel-preset 三、加载Vue文件1.编写App.v…

使用Ansible中的playbook

目录 1.Playbook的功能 2.YAML 3.YAML列表 4.YAML的字典 5.playbook执行命令 6.playbook的核心组件 7.vim 设定技巧 示例 1.Playbook的功能 playbook 是由一个或多个play组成的列表 Playboot 文件使用YAML来写的 2.YAML #简介# 是一种表达资料序列的格式,类似XML #特…

开关电源测试过压保护的测试标准及其方法

过压保护的原理 过压保护是电压超过预定值时降低电压的一种方式&#xff0c;原理是通过电路中的电压检测电路来检测电路中的电压是否超过了设定的阈值&#xff0c;如果超过了阈值&#xff0c;就会触发过压保护器件&#xff0c;使电源断开或使受控设备电压降低&#xff0c;保护电…

54.RabbitMQ快速实战以及核心概念详解

MQ MQ&#xff1a;MessageQueue&#xff0c;消息队列。这东西分两个部分来理解&#xff1a; 队列&#xff0c;是一种FIFO 先进先出的数据结构。 消息&#xff1a;在不同应用程序之间传递的数据。将消息以队列的形式存储起来&#xff0c;并且在不同的应用程序之间进行传递&am…

网络协议--TCP的交互数据流

19.1 引言 前一章我们介绍了TCP连接的建立与释放&#xff0c;现在来介绍使用TCP进行数据传输的有关问题。 一些有关TCP通信量的研究如[Caceres et al. 1991]发现&#xff0c;如果按照分组数量计算&#xff0c;约有一半的TCP报文段包含成块数据&#xff08;如FTP、电子邮件和U…

使用Fiddler进行Mock测试

1、接口抓包 找到要mock的接口&#xff0c;打开fiddler抓包 以某某接口为例&#xff0c;找到下面的接口 http://XXX/SYSTEMS 2、复制该接口数据到本地 在接口上进行右键点击&#xff0c;选择save -> …and Open as Local File -> 默认会保存至桌面&#xff0c;示例中的数…

uniapp的启动页、开屏广告

uniapp的启动页、开屏广告 启动页配置广告开屏 启动页配置 在manifest.json文件中找到APP启动界面配置&#xff0c;可以看到有Android和iOS的启动页面的配置 &#xff0c;选择自定义启动图即可配置 广告开屏 在pages中新建一个广告开屏文件并在pases.json的最顶部配置这个页…