Windows系统锁定时的屏幕信息(.NET)

时间:2010-03-15 14:38:12

标签: c# .net winforms appbar

我们有一个夜间流程可以更新用户个人电脑上的应用程序,这需要关闭应用程序并重新备份(不希望改变该流程)。

问题是我们在启动时构建一个需要有效屏幕的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}

3 个答案:

答案 0 :(得分:1)

没有干净的解决方案,Windows没有提供检测工作站被锁定以及“错误”桌面处于活动状态的方法。您只能检测会话切换,示例代码is here。为了完成这项工作,你几乎不得不在应用程序中包含这些代码,并让它留下一个面包屑,它可以在它开始备份时读回来。一旦使用它,请务必重置它,以便应用程序不会永久卡住。

答案 1 :(得分:0)

此屏幕锁定问题取决于您使用的是哪个版本,使用GINA锁定屏幕的XP和使用ContentProvider的Vista,这两种机制都对此负有最终责任。

查看屏幕是否被锁定的唯一方法是屏幕保护程序启动(可以通过运行pinvoke查询SystemsParameterInfo轻松查询,以查明屏幕保护程序是否处于活动状态 - < strong> SPI_GETSCREENSAVERRUNNING 和 SPI_GETSCREENSAVESECURE 以确定是否会触发GINA或Content Provider)按下WinKey + L以启动屏幕保护程序,在指定的时间段后,如果没有活动,则GINA或ContentProvider启动并用锁定屏幕替换屏幕保护程序...我在此处发布了两个相关链接,这些链接是关于Windows下的安全日志记录信息...

答案 2 :(得分:0)

这需要一些工作,但是您可以从user32使用EnumDisplayDevices,EnumDisplaySettingsEx,MonitorFromPoint,GetMonitorInfo并获取设备的屏幕截图。

如果PC被锁定,或者有活动的屏幕保护程序,则屏幕截图始终为米色。您可以检查该条件以了解系统是否已锁定。这适用于也是RDP的系统(例如,瘦客户端到XP VDI。)

至少在我的环境中有效。代码示例可以通过Google搜索找到。