利用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秒左右弹出锁屏界面

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MySQL-----事务

事务的概念 事务是一种机制&#xff0c;一个操作序列。包含了一组数据库的操作命令&#xff0c;所有的命令都是一个整体&#xff0c;向系统提交或者撤销的操作&#xff0c;要么都执行&#xff0c;要么都不执行。 是一个不可分割的单位 事务的ACID特点 ACID&#xff0c;是指在可…

趋势:实时的stable diffusion

视频中使用了实时模型&#xff1a;只需2~4 个步骤甚至一步即可生成768 x 768分辨率图像。 这项技术可以把任意的stable diffusion模型转为实时模型。 潜在一致性模型 LCM LCM 只需 4,000 个训练步骤&#xff08;约 32 个 A100 GPU 一小时&#xff09;即可从任何预训练的SD模型中…

BetterDisplay Pro v1.4.15(显示器管理管理软件)

BetterDisplay Pro是一款屏幕显示优化工具&#xff0c;可用于Windows和Mac操作系统。它可以帮助用户调整屏幕的亮度、对比度、色彩等参数&#xff0c;以获得更好的视觉体验。此外&#xff0c;BetterDisplay Pro还提供了一些额外的功能&#xff0c;如屏幕分割、窗口管理、快捷键…

本地模拟,服务器下载文件

题目要求&#xff1a; 编写客户端程序和服务器端程序客户端可以输入一个音乐 文件名&#xff0c;比如 美丽中国&#xff0c;服务端 收到音乐后&#xff0c;可以给客户端返回这个音乐文件&#xff0c;如果服务器没有这个文件&#xff0c;返回一个默认的音乐即可客户端收到文件后…

[架构之路-251/创业之路-82]:目标系统 - 纵向分层 - 企业信息化的呈现形态:常见企业信息化软件系统 - 商业智能、决策支持系统、知识管理

目录 前言&#xff1a; 一、企业信息化的结果&#xff1a;常见企业信息化软件 1.1 商业智能 - 管理层 1.1.1 什么是商业智能What 1.1.1.1 商业智能常见工具 1.1.2 为什么需要商业智能Why&#xff1f; 1.1.3 谁需要商业智能who&#xff1f; 1.1.4 商业智能在企业管理中的…

DC电源模块外壳材质对模块的影响有多少

BOSHIDA DC电源模块外壳材质对模块的影响有多少 DC电源模块外壳材质对模块的影响可能是多方面的&#xff0c;以下列举几点可能的影响&#xff1a; 1. 机械强度&#xff1a;外壳材质可能会影响模块的机械强度和耐久性&#xff0c;例如使用高强度材质可能会使模块更加耐用。 2.…

第一个QT程序

新建工程&#xff1a; 1. 点击“New Project” 2. 选择“Qt Widgets Application” 3. 工程名和路径 4. 构建系统选择 5. Details 一些细节 6. 选择Kits 7. 完成工程创建 点完成按钮 8. 运行下看 9. 一些示例代码 //main.cpp #include "mywidget.h"#include <Q…

JTA分布式事务管理器

XA协议:是一种标准协议&#xff0c;允许事务管理器协调多个资源管理器&#xff0c;确保在分布式事务中的一致性和原子性。 JTA:是JavaEE规范中的一种&#xff0c;用于管理分布式事务的 API&#xff0c;提供了事务的控制和协调机制 Atomikos理解成JTA的实现 XA是JTA的基础(JT…

springboot+mybatis查询两次数据库结果不一致

最近遇到个bug记录一下。情景再现&#xff1a;在一个方法里有多次查询数据库的操作&#xff0c;但查询出的数据字段会被自动翻译。&#xff08;比如1翻译成是&#xff0c;2翻译成否&#xff09;。原因&#xff1a;mybatis缓存会被代码修改。在同一个sqlsession下&#xff0c;第…

遥遥领先,免费开源的django4-vue3前后端分离项目

星域后台管理系统前端介绍 &#x1f33f;项目简介 本项目前端基于当下流行且常用的vue3作为主要技术栈进行开发&#xff0c;融合了typescript和element-plus-ui&#xff0c;提供暗黑模式和白昼模式两种主题以及全屏切换&#xff0c;开发bug少&#xff0c;简单易学&#xff0c…

学习笔记|两组率卡方检验和Fisher确切法|适用条件|规范表达|《小白爱上SPSS》课程:SPSS第十五讲 | 两组率卡方检验和Fisher确切法怎么做?

目录 学习目的软件版本原始文档两组率卡方检验和Fisher确切法适用条件简述一、实战案例读数据&#xff1a; 二、统计策略三、SPSS操作四、结果解读第一&#xff0c;分组统计描述结果第二&#xff0c;卡方检验。 五、规范报告1、规范表格2、规范文字 学习目的 SPSS第十五讲 | 两…

Windows、程序员必装的工具

一、Typora 啥也不说了直接上图 Markdown语法 Typora免费版 提取码&#xff1a;av01 二维码&#xff1a; 1&#xff09;页面展示 2&#xff09;主题 3&#xff09;偏好设置 4&#xff09;Markdown语法设置偏好 5&#xff09;编辑器 6&#xff09;系统 二、Snipaste Snipaste…

腾讯云双11活动时间、活动入口、优惠政策详细解读

2023年腾讯云双11大促活动已开启&#xff0c;作为年终最大的一次优惠促销活动&#xff0c;腾讯云的优惠力度还是不错的&#xff0c;爆款云服务器首年88元&#xff0c;还有9999元大额代金券免费领取&#xff01; 一、腾讯云双11活动时间 即日起至2023-11-30 23:59:59&#xff0…

Modelsim 使用教程(4)—— Working With Multiple Libraries

一、概述 在文中&#xff0c;我们将练习使用多个库。在实际的项目开发过程中&#xff0c;我们可能有多个库来组织设计&#xff0c;从第三方源代码访问IP&#xff0c;或者在仿真之间共享公共部分。我们将通过创建一个包含计数器设计单元的资源库来开始本文。接下来&#xff0c;我…

怎样提取视频提取的人声或伴奏?

有些小伙伴们进行音视频创作时&#xff0c;可能会需要提取音频的人声或者是伴奏。这里给大家推荐一个音分轨人声分离软件&#xff0c;支持一键提取音频人声和一键提取伴奏功能&#xff0c;可批量导入文件同步提取&#xff0c;简单高效&#xff0c;是音视频创作者的不二选择&…

HarmonyOS开发:开源一个刷新加载组件

前言 系统Api中提供了下拉刷新组件Refresh&#xff0c;使用起来也是非常的好用&#xff0c;但是风格和日常的开发&#xff0c;有着巨大的出入&#xff0c;效果如下&#xff1a; 显然上面的效果是很难满足我们实际的需求的&#xff0c;奈何也没有提供的属性可以更改&#xff0c;…

linux远程桌面管理工具xrdp

一、概述 我们知道&#xff0c;我们日常通过vnc来远程管理linux图形界面&#xff0c;今天分享一工具Xrdp&#xff0c;它是一个开源工具&#xff0c;允许用户通过Windows RDP访问Linux远程桌面。 除了Windows RDP之外&#xff0c;xrdp工具还接受来自其他RDP客户端的连接&#xf…

量子计算与量子密码(入门级-少图版)

量子计算与量子密码 写在最前面一些可能带来的有趣的知识和潜在的收获 1、Introduction导言四个特性不确定性&#xff08;自由意志论&#xff09;Indeterminism不确定性Uncertainty叠加原理(线性)superposition (linearity)纠缠entanglement 虚数的常见基本运算欧拉公式&#x…

Linux下使用vscode编写Python项目

我此处是使用VScode远程连接的服务器&#xff0c;具体方法可看如下&#xff1a; 1、vscode中安装Python插件 按上面步骤安装好Python插件后&#xff0c;重启vscode&#xff1b; 2、选择Python解释器 创建Python项目结构&#xff1a; 按下F1&#xff0c;打开vscode命令栏&am…

自动驾驶算法(一):Dijkstra算法讲解与代码实现

目录 0 本节关键词&#xff1a;栅格地图、算法、路径规划 1 Dijkstra算法详解 2 Dijkstra代码详解 0 本节关键词&#xff1a;栅格地图、算法、路径规划 1 Dijkstra算法详解 用于图中寻找最短路径。节点是地点&#xff0c;边是权重。 从起点开始逐步扩展&#xff0c;每一步为一…