gpt4 book ai didi

c++ - Windows 10 夜灯是如何实现的?

转载 作者:搜寻专家 更新时间:2023-10-31 02:01:58 24 4
gpt4 key购买 nike

Windows 10 有一个名为 Night Light 的更改屏幕色温的功能。这是一项减少蓝光的功能。

我想使用 Windows API 在 C++ 中实现此功能的克隆。但不知道该怎么做。

  • 如何使用 win api 访问屏幕并更改它在系统范围内显示的内容?它必须具有资源效率。
  • 我们能否仅将其应用于给定窗口,而不是整个屏幕?

最佳答案

操作系统允许您做它自己做的事情并不总是有效的期望。仅仅因为“操作系统应该能够访问屏幕”并不意味着(在用户空间中)应该能够做到这一点。最肯定的是,在 Windows 下,您无法不受限制地访问屏幕,尤其是因为 DRM:有一个 protected media path (PMP)对于 protected 视频和音频内容,您将无法从任意进程中嗅探到它。

因此:无论您通过访问屏幕内容实现的任何夜灯,只要显示任何 protected 内容,例如来自 Netflix、Hulu、Youtube Red、系统 DVD 播放器、蓝光播放器等。要绕过 PMP,您需要编写一个驱动程序,使用 EV 代码签名证书对其进行签名,然后将其提交以进行自动化 attestation signing by Microsoft .而且您不敢将它放在网络上,因为 Microsoft 会将该驱动程序列入黑名单(即它在内核中的存在会导致使用 PMP 的应用程序拒绝播放 protected 内容),而且可能会很快。

除此之外,Windows 可以通过多种方式实现它,但我们不在乎,因为我们不是在编写 Windows Night Light 组件的直接替代品。我们只能访问用户空间。下面是我们要处理的内容,然后:

  1. Windows 本身使用“ Gamma 斜坡”系统执行显示器色彩空间校准:一个查找表,过去主要用于显示器响应的线性化,后来用作厨房水槽。这些 API 分为三代:

    • 最传统的兼容方式是使用 Windows Color System API,自 Windows 2000 起支持。要使用的函数是 SetDeviceGammaRamp .需要注意的是:Windows 不允许过多地压缩颜色,而且它允许的内容非常随意。如果您尝试做“太多”,这个 API 系列可能会失败。

    • 另一个高度兼容的 API 将在 Direct3D 9 中(自 Windows 98 和 XP 起可用)。它提供SetGammaRamp , 数据表格式与上述SetDeviceGammaRamp相同。

    • 另一个高度兼容的 API 将在 Direct3D 10-12 的 DirectX Graphics Interface - DXGI 中, 具体来说 IDXGIOutput::SetGammaControl .这是自 Windows Vista 以来可用的,因此在当前 (2020) 支持的 Windows 版本上可用。

  2. 下一个最兼容的方法是使用 Magnification API .

  3. 最后一种方法,仅适用于您自己的应用程序窗口,是应用 shader to your window .

关于c++ - Windows 10 夜灯是如何实现的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58205092/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com