可以用系列 - WPF 长期无输入软件锁屏实现

本文详细介绍了如何在WPF应用程序中实现长期无用户输入时的自动锁屏功能。通过捕获鼠标键盘输入时间、将窗体移出屏幕以及创建锁屏弹出框,达到隐藏界面并保护信息安全的效果。在遇到模式化窗口隐藏问题时,提出了将窗体位置调整到屏幕外的独特解决方案。
摘要由CSDN通过智能技术生成

目录

一 问题描述

二 关键问题

三 处理流程

四 代码实现

捕获鼠标键盘最近1次的输入时间

通过将窗体扔出屏幕来实现隐藏窗体

自动锁屏控制器(软件启动时初始化)

锁屏弹出框


一 问题描述

        桌面软件的使用过程中,若用户离开,打开中的界面可能存在泄密的风险,因此,常有需求需要识别到用户电脑上经过一段时间没有操作时,隐藏掉当前所有界面,并弹出锁定框,用户在输入密码后,显示之前隐藏的界面

二 关键问题

        模式化窗口的隐藏是个大麻烦。在主窗口以ShowDialog的方式来呈现子窗口时,子窗口属于模式化窗口,即只有子窗口接收用户响应,主窗口停止用户响应,并等待子窗口的返回。如果这时候,将子窗口的Visibility设置为Hidden或者Collapsed后,再恢复成Visible后,子窗口的模态属性消失,主子窗体都能接收用户响应,并且在设置子窗体的DialogResult属性时,会抛出系统异常。

       如果该问题无法解决,就没有办法去将窗体隐藏,只能禁用或者设置窗体透明度,但这2种方案都不是好的方式,窗体要么还在要么一片漆黑。

       我们的目的只是让窗体消失,常规策略无法达到预期效果时,考虑采用将界面远远地扔出显示屏的策略来达到目的

三 处理流程

  1. 程序启动时,初始化计时器,定时监控鼠标、键盘的最近一次输入时间
  2. 一旦发现超过预定的时间没有外部操作时,触发锁屏机制
  3. 锁屏具体实现为,首先获取到当前软件所有打开的窗体,记录这些窗体当前位置,然后修改这些窗体的位置为屏幕外,同时将任务栏相应图标隐藏,以此达到窗体消失的目的,最后弹出密码输入框
  4. 密码输入框禁用掉关闭功能,在密码输入框中输入正确的当前登陆用户的密码后,关闭密码输入框,将之前“隐藏”的窗体再拉回屏幕中的原来位置,同时恢复任务栏图标

四 代码实现

捕获鼠标键盘最近1次的输入时间

    /// <summary>
    /// 上次鼠标键盘活动的时间结构
    /// </summary>
    [StructLayout(LayoutKind.Sequential)]
    internal struct LASTINPUTINFO
    {
        [MarshalAs(UnmanagedType.U4)]
        public int cbSize;

        [MarshalAs(UnmanagedType.U4)]
        public int dwTime;
    }

    /// <summary>
    /// 获取鼠标键盘不活动的时间
    /// </summary>
    public class GetLastInputInfoHelp
    {
        /// <summary>
        /// 获取上次输入操作时间
        /// </summary>
        /// <param name="plii"></param>
        /// <returns></returns>
        [DllImport("user32.dll")]
        internal static extern bool GetLastInputInfo(ref LASTINPUTINFO plii);

        /// <summary>
        /// 获取鼠标键盘不活动的时间
        /// </summary>
        /// <returns>结果</returns>
        public static int GetLastInputTime()
        {
            LASTINPUTINFO lastInputInfo = new LASTINPUTINFO();
            lastInputInfo.cbSize = Marshal.SizeOf(lastInputInfo);
            lastInputInfo.dwTime = 0;

            int idleTime = 0;
            if (GetLastInputInfo(ref lastInputInfo))
            {
                idleTime = Environment.TickCount - lastInputInfo.dwTime;
            }

            return (idleTime > 0) ? (idleTime / 1000) : 0;
        }
    }

通过将窗体扔出屏幕来实现隐藏窗体

    /// <summary>
    /// 窗体显示控制器
    /// 通过将窗体扔出屏幕外的方式来实现窗体的隐藏
    /// </summary>
    public class WindowVisibilityHelper : DependencyObject
    {
        /// <summary>
        /// 获取当前对象是否可见
        /// </summary>
        /// <param name="obj">窗体</param>
        /// <returns>true 可见 false 不可见</returns>
        public static bool GetIsVisible(DependencyObject obj)
        {
            return (bool)obj.GetValue(IsVisibleProperty);
        }

        /// <summary>
        /// 设置对象可见性
        /// </summary>
        /// <param name="obj">窗体</param>
        /// <param name="value"&g
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

deanZZZZZZ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值