目录
一 问题描述
桌面软件的使用过程中,若用户离开,打开中的界面可能存在泄密的风险,因此,常有需求需要识别到用户电脑上经过一段时间没有操作时,隐藏掉当前所有界面,并弹出锁定框,用户在输入密码后,显示之前隐藏的界面
二 关键问题
模式化窗口的隐藏是个大麻烦。在主窗口以ShowDialog的方式来呈现子窗口时,子窗口属于模式化窗口,即只有子窗口接收用户响应,主窗口停止用户响应,并等待子窗口的返回。如果这时候,将子窗口的Visibility设置为Hidden或者Collapsed后,再恢复成Visible后,子窗口的模态属性消失,主子窗体都能接收用户响应,并且在设置子窗体的DialogResult属性时,会抛出系统异常。
如果该问题无法解决,就没有办法去将窗体隐藏,只能禁用或者设置窗体透明度,但这2种方案都不是好的方式,窗体要么还在要么一片漆黑。
我们的目的只是让窗体消失,常规策略无法达到预期效果时,考虑采用将界面远远地扔出显示屏的策略来达到目的
三 处理流程
- 程序启动时,初始化计时器,定时监控鼠标、键盘的最近一次输入时间
- 一旦发现超过预定的时间没有外部操作时,触发锁屏机制
- 锁屏具体实现为,首先获取到当前软件所有打开的窗体,记录这些窗体当前位置,然后修改这些窗体的位置为屏幕外,同时将任务栏相应图标隐藏,以此达到窗体消失的目的,最后弹出密码输入框
- 密码输入框禁用掉关闭功能,在密码输入框中输入正确的当前登陆用户的密码后,关闭密码输入框,将之前“隐藏”的窗体再拉回屏幕中的原来位置,同时恢复任务栏图标
四 代码实现
捕获鼠标键盘最近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