c# - 弹出UAC消息时屏幕颜色默认为正常(无法检测到)

标签 c# c winapi graphics gdi

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

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

如果我有一种万无一失的方法来检测 Windows 何时像这样改变屏幕颜色就好了。或者如果失败了,只要它能够响应将颜色更改回旧颜色,而不是思考“但您已经处于该 RGB 颜色,那么为什么要再次设置它!” ,显然不是。

不幸的是,除非我找到解决方案,否则我必须强制程序每分钟左右闪烁一次稍微不同的颜色(包括我自己在内的许多人都可以注意到)。这是为了防止 UAC 提示或计算机唤醒发生而改变屏幕颜色。

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

最佳答案

If only I had a fool-proof way of detecting when Windows changes the screen's colour like this

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

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

出于显而易见的原因,安全桌面具有高度防篡改能力。其一,您无法判断它是否处于事件状态,这将使恶意软件很容易开始探测。另一方面,如果 SetDeviceGammaRamp() 也影响安全桌面,那么它就太危险了。恶意软件可能会做一些做作的事情,例如将渐变设置为全黑,从而使用户看起来完全失去控制,无法再让 Ctrl+Alt+Del 工作。所以它没有任何效果,你会得到默认的斜坡。​​

虽然您无法检测到安全桌面是否处于事件状态,但您可以收到 session 切换的通知。 WTSRegisterSessionNotification() 函数。这并不是说有帮助,您设置的斜坡仍然仅适用于用户的桌面。为了使其永久化,您必须说服视频驱动程序应用颜色校正配置文件。通常由控制面板+颜色校正小程序完成。或者视频驱动程序附带的常见铲子软件。在你自己的程序中很难弄清楚它是如何完成的,它肯定不是很实用,因为它需要 UAC 提示:)

关于c# - 弹出UAC消息时屏幕颜色默认为正常(无法检测到),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29329119/

相关文章:

c# - 为什么我在阅读 PDF 时页面内容会变得困惑?

c# - 添加具有相同接口(interface)的 HttpClient 最终具有相同的基本 url Asp.Net Core

c# - 输出类型为类库的项目无法直接启动(2)

c# - 如何使用 ServiceStack Grpc 获取简单的字符串流?

c - 如何获取指针指向的内存大小?

c - 我应该在我的应用程序关闭时关闭套接字吗?

c - 米斯拉规则 19.7 : function like macro

对更新 C 中的结构成员感到困惑

winapi - 从资源文件创建图像列表 - win32

python - 来自 Python 服务的警报弹出窗口