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

这篇具有很好参考价值的文章主要介绍了利用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,最后界面如下图:

利用win32的GetLastInputInfo函数实现锁屏(C#),C#编程,c#,锁屏,winform,息屏

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

利用win32的GetLastInputInfo函数实现锁屏(C#),C#编程,c#,锁屏,winform,息屏

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

利用win32的GetLastInputInfo函数实现锁屏(C#),C#编程,c#,锁屏,winform,息屏文章来源地址https://www.toymoban.com/news/detail-741098.html

到了这里,关于利用win32的GetLastInputInfo函数实现锁屏(C#)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【win10】电脑电源键按下,不锁屏的解决办法

    问题:电脑电源键按下,屏幕未变黑未锁屏 解决步骤: 1.右键电源,选择电源选项 2.点击“选择关闭笔记本计算机盖的功能” 3.设置如下:

    2024年01月20日
    浏览(178)
  • win10系统电脑修改注册表设置自动锁屏时间

    描述:win10系统笔记本电脑修改注册表设置自动锁屏时间的方法 步骤:     win键+r,输入regedit进入注册表界面       注册表界面按照路径 直接复制粘贴到下面的输入框中HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionPoliciesSystem          空白处右键新建 DWORD(32位)值,命

    2024年02月11日
    浏览(39)
  • Win32 GetDeviceCaps 函数学习

    GetDeviceCaps 函数检索指定设备的设备特定信息。 其第二个参数取不同的值,返回不同结果;

    2024年01月21日
    浏览(33)
  • [C#]winform利用seetaface6实现C#人脸检测活体检测口罩检测年龄预测性别判断眼睛状态检测

    【官方框架地址】 https://github.com/ViewFaceCore/ViewFaceCore 【算法介绍】 SeetaFace6是由中国科技公司自主研发的一款人脸识别技术,它基于深度学习算法,能够快速、准确地识别出人脸,并且支持多种应用场景,如门禁系统、移动支付、安全监控等。SeetaFace6的识别准确率高达99%以上

    2024年01月21日
    浏览(54)
  • win10锁屏或登录时会自动弹出触摸按键的问题解决办法

    本篇文章主要讲解win10锁屏或登录时会自动弹出触摸按键的问题解决方式。 日期:2023年5月17日 作者:任聪聪 如下截图为屏幕按键 设置路径:设置–轻松使用–键盘 说明:见图中右侧第一个选择项即使用屏幕键盘的方法,但这并不是本次我们的问题原因。(网路上说将此处

    2024年02月09日
    浏览(62)
  • win32 API 文件夹操作函数整理

    常用操作文件目录的函数 1. CreateDirectory 创建文件夹 原型: 参数说明: lpPathName 要创建的文件夹名称 lpSecurityAttributes 忽略为NULL 返回: 成功返回非零,失败返回零 实例:   2.RemoveDirectory 删除文件夹 原型: 返回: 成功返回非零,失败返回零   3. PathIsDirectory 判断文件夹是否存在 原

    2024年02月05日
    浏览(41)
  • 【Win32绘图编程,GDI绘图对象】绘图基础,位图处理,绘图消息处理,画笔,画刷,文本绘制

    这一篇文章分享本人学习win32绘图编程,其中包括GDI绘图对象,绘图基础,基本图形的绘制,画笔画刷的使用,文本绘制,以及文本字体的更改。 绘图设备DC(Device Context),有时也叫做绘图上下文/绘图描述表/显示设备上下文 HDC-DC句柄,表示绘图设备 GDI-Windows graphics device

    2024年02月07日
    浏览(47)
  • Win32子窗口创建,子窗口回调函数,消息堆栈,逆向定位子窗口消息处理过程

    本专栏上一篇文章中我们讲解了Win32程序入口识别,定位回调函数,具体事件处理的定位,这一章节中我们来讲解一下子窗口的创建,子窗口的回调函数,并且逆向分析子窗口消息处理过程。 我在学到本课程中Win32的时候,实在是听不懂,所以我专门去学习了Win32应用程序设计

    2024年02月06日
    浏览(57)
  • Winform/WPF利用CefSharp集成vue开发

    有时候因为各种原因,可能在开发winform或wpf项目的时候需要嵌入web项目,而目前vue在web开发中还是非常流行的,今天有空琢磨了一下怎么在winform中集成vue进行开发,当然,winform能实现,wpf也是一样的。 目前希望达到的效果是,能够在winform中显示web界面,并且能够与vue中的

    2024年02月08日
    浏览(43)
  • C# 实现打印机队列监控Win32_PrintJob,Win32_Printer

    实现一个检测系统发出的打印队列文件,打印的状态,打印机状态的模块。 先上效果图 要用到Win32_PrintJob,Win32_Printer。 其中,Win32_Printer是打印机的各种状态和控制。 Win32_Printer 类 - Win32 apps | Microsoft Learn Win32_PrintJob是打印队列的各种数据和状态。Win32_PrintJob 类 - Win32 apps |

    2024年02月04日
    浏览(80)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包