弹出UAC消息时屏幕颜色默认为正常(不可检测)

时间:2015-03-29 12:30:28

标签: c# c winapi graphics gdi

我已经创建了一个程序,可以根据日落和日出自动调整屏幕的滤色器。我使用GetDeviceGammaRamp()SetDeviceGammaRamp()方法from here来实现此目的。

然而,有一个问题。当计算机从睡眠状态唤醒时,或弹出UAC message时(例如:从打开安装exe文件),然后在我的笔记本电脑上,屏幕颜色恢复正常。一切都很好,如果它是暂时的,但它的方式虽然看起来不标准,因为之后,GetDeviceGammaRamp()返回相同的先前颜色,而不是显示的新颜色!此外,如果我使用SetDeviceGammaRamp()尝试再次设置旧颜色,则拒绝设置。但是,如果我使用SetDeviceGammaRamp()更改RGB颜色,即使只是轻微(例如:RGB = 80,80,81而不是旧的80,80,80),那么Windows会很乐意将颜色设置为

如果我只有一种万无一失的方式来检测Windows何时更改屏幕的颜色。或者失败了,如果只是它会响应将颜色改回原来的颜色而不是想“但你已经处于RGB颜色,那你为什么要再次设置呢!”,当清楚的时候不是。

不幸的是,除非我找到解决方案,否则我必须强制程序每隔一分钟左右闪烁一个非常不同的颜色(包括我在内的很多人都会注意到)。这是因为UAC提示或计算机唤醒会改变屏幕的颜色。

顺便说一下,着名的F.lux程序并没有解决问题,因为他们的程序也有问题。有趣的是,当UAC提示出现时,我的桌面保持相同的颜色 - 这只是我的笔记本电脑有问题。

1 个答案:

答案 0 :(得分:3)

  

如果我只有一种万无一失的方式来检测Windows何时改变屏幕的颜色

了解Windows显示UAC提示时真正的内容非常重要。 看起来就像在用户桌面上显示对话框一样。然而,这是一种幻觉,它实际上将视图切换到安全桌面。用于在启动时显示登录提示的相同提示或用于锁定工作站时切换到的提示(Win + L键)或按Ctrl + Alt + Del键。

您看到用户桌面的错觉实现起来非常简单,它只是在后台显示屏幕截图。也很容易让它看起来更暗。

出于显而易见的原因,安全桌面具有高度防篡改性。首先,你不能说它是活跃的,这将使恶意软件很容易开始探测。另一方面,SetDeviceGammaRamp()如果它也影响了安全桌面,则太危险了。恶意软件可以做一些事情,比如将斜坡设置为全黑,从而使看起来就像用户完全失去控制一样,无法再使Ctrl + Alt + Del工作。所以它没有任何效果,你得到默认的斜坡。​​

虽然您无法检测到安全桌面处于活动状态,但您可以获得会话切换的通知。 WTSRegisterSessionNotification()函数。这并没有帮助,您设置的斜坡仍然只适用于用户的桌面。要使其永久化,您必须说服视频驱动程序应用颜色校正配置文件。通常由控制面板+色彩校正小程序完成。或者与视频驱动程序一起提供的通常的铲子。在你自己的程序中如何完成它很难找到,它肯定不是很实用,因为它需要UAC提示:)