我创建了一个程序,可以根据日落和日出自动调整屏幕的滤色器。我使用从这里获得的GetDeviceGammaRamp()
和SetDeviceGammaRamp()
方法来实现这一点。
然而,存在一个问题。当电脑从睡眠中醒来,或者弹出UAC message
(例如:打开安装exe文件)时,在我的笔记本电脑上,屏幕颜色会恢复正常。如果是临时的,一切都很好,但它这样做的方式似乎是不标准的,因为之后,GetDeviceGammaRamp()
返回相同的以前的颜色,而不是显示的新颜色!此外,如果我使用SetDeviceGammaRamp()
尝试再次设置旧颜色,它将拒绝设置。然而,如果我使用SetDeviceGammaRamp()
来更改RGB
的颜色,即使只是轻微的(例如:RGB = 80,80,81
而不是旧的80,80,80
),那么Windows会很乐意将颜色设置为该颜色。
如果我有一个傻瓜般的方法来检测Windows何时像这样改变屏幕颜色就好了。如果做不到这一点,如果它能将颜色改回旧颜色,而不是想"但你已经是RGB
颜色了,为什么要再次设置呢!",而事实显然不是。
不幸的是,除非我找到解决方案,否则我必须强迫程序每隔一分钟左右就会闪烁到一种稍微不同的颜色(包括我自己在内的许多人都会注意到这一点)。这是在UAC
提示或计算机唤醒改变屏幕颜色的情况下发生的。
顺便说一句,著名的F.lux
程序并没有解决这个问题,因为他们的程序也有这个问题。有趣的是,当出现UAC
提示时,我的桌面保持不变——只是我的笔记本电脑出现了问题。
如果我有一个傻瓜般的方法来检测Windows何时像一样改变屏幕颜色就好了
当Windows显示UAC提示时,了解真正发生了什么非常重要。它看起来像是在用户桌面上显示对话框。然而,这只是一种幻觉,它实际上将视图切换到了安全的桌面。与启动时用于显示登录提示的相同,或锁定工作站(Win+L键)或按Ctrl+Alt+Del键时切换到的相同。
你看到用户桌面的错觉在其他方面很容易实现,它只是在后台显示一个屏幕截图。这样也很容易让它看起来更黑。
出于显而易见的原因,安全桌面是高度防篡改的。首先,你不能判断它是活动的,这会让恶意软件很容易开始探测。另一方面,如果SetDeviceGammaRamp()也影响了安全桌面,那么它就太危险了。恶意软件可能会做一些恶作剧,比如将渐变设置为全黑,从而使其看起来就像用户完全失去了控制,无法再使用Ctrl+Alt+Del。所以它没有任何效果,你会得到默认的渐变。
虽然您无法检测到安全桌面处于活动状态,但您可以收到会话切换的通知。WTSRegisterSessionNotification()函数。这并没有帮助,您设置的渐变仍然只适用于用户的桌面。要使其永久化,您必须说服视频驱动程序应用颜色校正配置文件。通常由控制面板+颜色校正小程序完成。或者视频驱动程序附带的常用铲子软件。在你自己的程序中是如何完成的很难找到,它肯定不是很实用,因为它需要UAC提示:)