Windows 系统锁定时的屏幕信息 (.NET)
题
我们有一个每晚更新用户电脑上的应用程序的流程,这需要关闭应用程序并再次备份(不打算更改该流程)。
问题是我们在启动时构建一个 Windows AppBar,它需要一个有效的屏幕,而当系统锁定时,Screen 类中就没有一个。所以没有启用任何视觉效果,而且看起来非常丑陋。
目前解决此问题的唯一方法是检测锁定的屏幕,然后旋转并等待用户解锁桌面,然后继续启动。不保留它不是一个选择,因为这是我们用户工作流程的关键部分,如果他们在前一天晚上保留它,他们希望它能够启动并运行。
有任何想法吗??我似乎无法在任何地方找到显示信息,但它必须存储在某个地方,因为用户仍然处于登录状态。
Screen.AllScreens 数组的内容:
** 锁定时:
Device Name : DISPLAY
Primary : True
Bits Per Pixel : 0
Bounds : {X=-1280,Y=0,Width=2560,Height=1024}
Working Area : {X=0,Y=0,Width=1280,Height=1024}
** 解锁后:
Device Name : \\.\DISPLAY1
Primary : True
Bits Per Pixel : 32
Bounds : {X=0,Y=0,Width=1280,Height=1024}
Working Area : {X=0,Y=0,Width=1280,Height=994}
Device Name : \\.\DISPLAY2
Primary : False
Bits Per Pixel : 32
Bounds : {X=-1280,Y=0,Width=1280,Height=1024}
Working Area : {X=-1280,Y=0,Width=1280,Height=964}
解决方案
有对此没有清晰的解决方案,Windows不提供一种方法来检测该工作站被锁定,“错误”的桌面处于活动状态。只能检测会话开关,示例代码是此处一>。为了使这项工作,你几乎被迫包括在应用程序代码并把它留下痕迹,它可以读回当它开始备份。一定要重置你用过一次后,这样的应用程序不能得到永远停留。
其他提示
这个屏幕锁定问题取决于您使用的版本,无论是使用 GINA 锁定屏幕的 XP 还是使用 ContentProvider 的 Vista,这两种机制最终都会对此负责。
查看屏幕是否锁定的唯一方法是启动屏幕保护程序(这可以通过运行 pinvoke 来查询来轻松查询 系统参数信息, ,了解屏幕保护程序是否处于活动状态 - SPI_GETSCREENSAVERRUNNING 和 SPI_GETSCREENSAVESECURE 以确定是否会触发 GINA 或 Content Provider),当按 WinKey + L 启动屏幕保护程序时,在指定的时间段后,如果没有任何活动,则 GINA 或 ContentProvider 启动并用锁定屏幕替换屏幕保护程序。 ..我在此处添加了两个有关 Windows 下安全日志记录信息的相关链接...
这需要一点点工作,但你可以利用EnumDisplayDevices,EnumDisplaySettingsEx,MonitorFromPoint,GetMonitorInfo全部来自USER32和抢设备的屏幕截图。
如果PC被锁定,或者如果有活性的屏幕保护程序,则屏幕捕获始终是一个米色。你可以检查该条件知道系统被锁定。这适用于系统被RDPed成也(瘦客户机到XP的VDI例如)
目前,在我的环境中工作最少。码样本可通过谷歌搜索中找到。