如何使用C#锁定屏幕?

7

我刚写了我的第一个C#应用程序,这是一个调度器。每小时一次,我想要弹出一个对话框并锁定屏幕两分钟以便休息。

目前为止,我的应用程序只在需要休息时显示一个“TopMost”表单,并在两分钟后隐藏它。

如何锁定屏幕呢?类似于Vista中的UAC风格。

2个回答

8
抱歉,我之前误读了你的问题。Vista的UAC对话框会创建一个新的桌面并在其上显示。要创建桌面,您可以使用CreateDesktop函数。然后,您可以使用SwitchDesktop切换到它。
如果您真的想重新创建安全桌面的外观,则需要先截取屏幕截图,然后在您的窗体上显示该截图,并稍微变暗一些。
以下是原始答案,可能也很有趣:
请参阅LockWorkStation函数。
但是,您无法以编程方式解锁工作站。这是用户必须自己完成的操作。因此,除非您仍然采用拒绝用户使用工作区的顶级窗口技术,否则您无法轻松强制执行至少两分钟的休息时间。

5
作为截屏的替代方法(在稍微不同的情况下,我也曾经使用过这种方法),您还可以通过创建一个全屏且位于所有其他窗口之上的新窗口(WinForm)来完成此操作。
如果您将窗口背景颜色设置为纯黑色,然后将不透明度设置为70-80%,您将得到类似于UAC提示的东西。
例如:
formName.WindowState = FormWindowState.Maximized; 
formName.FormBorderStyle = FormBorderStyle.None; 
formName.Opacity = 0.70; 
formName.TopMost = true;

当然,在屏幕变暗时,我们需要在顶部绘制一个窗口,告知用户为什么会这样,并带有计数器。
使用类似于UAC提示的东西(人们习惯于看到),以至于人们不会再想两次,这可能已经足够了,具体取决于用例。
与屏幕截图方法一样,单独使用此方法不能防止用户通过使用Windows键、Alt-TabCtrl-Esc来绕过它,或切换到其他任务。
禁用内置键命令需要设置与Windows热键相关的注册表键,这有点棘手(我认为需要重新启动,不能即时切换)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接