【问题标题】:Take screenshot right before Windows locks在 Windows 锁定之前截取屏幕截图
【发布时间】:2019-06-20 10:14:55
【问题描述】:

我只是玩了一下。我尝试在用户锁定机器之前截取主监视器的屏幕截图。到目前为止,没有任何效果。

我尝试了SystemEvents.SessionSwith,但当时窗口处理程序不再有效。

我还尝试了LowLevelKeyboardProc 来捕捉 Win+L,截取屏幕截图,然后自己锁定机器 - 但 Win+L 似乎是一个受某种保护的快捷方式。

这就是我目前所得到的

protected override void OnStartup(StartupEventArgs e)
{
    base.OnStartup(e);
    SystemEvents.SessionSwitch += SystemEvents_SessionSwitch;
}

private void SystemEvents_SessionSwitch(object sender, SessionSwitchEventArgs e)
{
    switch (e.Reason)
    {
        case SessionSwitchReason.SessionLock: TakeScreenShot(); break;
    }
}

private void TakeScreenShot()
{
    var screen = Screen.AllScreens.Single(x => x.Primary);
    var screenshot = new Bitmap(screen.Bounds.Width, screen.Bounds.Height, PixelFormat.Format32bppArgb);
    var gfxScreenshot = Graphics.FromImage(screenshot);
    gfxScreenshot.CopyFromScreen(screen.Bounds.X, screen.Bounds.Y, 0, 0, screen.Bounds.Size, CopyPixelOperation.SourceCopy);
    screenshot.Save("tmp.png");
}

System.ComponentModel.Win32Exception: 'The handle is invalid' 失败

【问题讨论】:

  • 嗯,这听起来一点也不像可怕的安全风险,不,一点也不!
  • 所以它与任何其他时间相同。这是用户明确要求桌面应该锁定的时候。这是一个安全操作系统级别的事件,而不是桌面或应用程序 UI 事件。 SessionSwitch 的存在是为了警告应用程序发生了这种变化,这样他们就会知道桌面等资源不再可用,并且他们可能必须采取行动来存储他们的状态。
  • Screen.AllScreens.Single(x => x.Primary) 尝试使用用户的桌面,该桌面不再可用。每个用户都有不同的桌面。锁屏是一个不属于任何用户的桌面。锁定后尝试访问屏幕失败,因为桌面不再存在。
  • 我知道。 在桌面被锁定之前需要一些钩子。有什么创意吗?对于安全问题:放松,这只是一个有趣的项目,我花了不到一个小时的空闲时间来看看有什么可能。受到 Linux 锁屏的启发,该锁屏显示了非常像素化的桌面版本。
  • take the screenshot and then lock the machine myself 是一个巨大的安全风险。如果拦截注销/锁定是可能的,任何恶意软件都能够伪造注销或锁定,并允许某人在注销后使用其他人的计算机。这可能是书中最古老的 hack,可以追溯到第一台 UNIX 计算机中的假登录屏幕。这就是为什么像Ctrl+Alt+Del 这样不可拦截的击键和完全不同的桌面被用于锁定屏幕阿联酋屏幕

标签: c# windows screenshot lockscreen


【解决方案1】:

我最终使用自己的快捷方式 (Win+Shift+L) 截取屏幕截图,然后锁定机器。感谢@Hans Passant 的提示。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多