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

C++ Windows 10夜灯是如何实现的?,c++,windows,winapi,C++,Windows,Winapi,Windows 10具有更改屏幕色温的功能,名为夜灯。这是一个蓝光减少功能 我想用C++实现C++中的这个特性的克隆。但是我不知道怎么做 如何使用win api访问屏幕并更改其在系统范围内的显示内容?它必须具有资源效率 我们能不能只在一个给定的窗口上应用它,而不是在整个屏幕上 期望操作系统允许您做它自己做的事情并不总是正确的。仅仅因为“操作系统应该能够访问屏幕”并不意味着你(在userland中)应该能够做到这一点。而且最肯定的是,在Windows下,您无法不受限制地访问屏幕,尤其是因为DRM

Windows 10具有更改屏幕色温的功能,名为夜灯。这是一个蓝光减少功能

<>我想用C++实现C++中的这个特性的克隆。但是我不知道怎么做

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

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

因此:无论您通过访问屏幕内容来实现什么样的夜间照明,只要显示任何受保护的内容(例如来自Netflix、Hulu、Youtube Red、system DVD player、BluRay player等)就不会起作用。要绕过PMP,您需要编写一个驱动程序,使用EV代码签名证书签名,然后提交自动认证。而且你也不敢把它放到网上,因为微软会把这个驱动程序列入黑名单(也就是说,它出现在内核中会导致使用PMP的应用程序拒绝播放受保护的内容),而且可能会很快

有了这一点,Windows有几种方法可以实现它,但我们不在乎,因为我们没有编写Windows夜灯组件的直接替代品。我们所能访问的只有用户区。下面是我们需要解决的问题:

  • Windows本身使用“gamma ramp”系统执行监视器颜色空间校准:一个查找表,过去主要用于监视器响应的线性化,后来用作厨房水槽。这些API有三代:

    • 最传统的兼容方式是使用自Windows 2000以来支持的API。要使用的函数是。这里有一个警告:Windows不允许对颜色进行过多压缩,而且它允许的内容非常随意。如果您试图“做得太多”,这一系列API可能会失败

    • 另一个高度兼容的API是Direct3D 9(从Windows 98和XP开始提供)。它提供与上面的
      SetDeviceGammaRamp
      相同的数据表格式

    • 另一个高度兼容的API将在Direct3D 10-12中,具体来说。此版本自Windows Vista开始提供,因此在当前(2020)支持的Windows版本上可用

  • 下一个最兼容的方法是使用

  • 最后一种方法(仅在您自己的应用程序窗口上工作)是应用


  • 这可以使用颜色校正方案进行模拟。有一个开源项目,DisplayCAL。它是一种校准器,用于其他用途,也允许使用各种校准器设备。基本上,所有图形输出设备都有一个数字滤波器,它可以将源RGB转换为屏幕RGB,并且有可能对其进行更改。Linux在某些DistROS中有类似的东西。

    ……什么是访问屏幕的规范方式……“C++没有直接的方式访问屏幕,你必须使用第三方API /库。对于WinAPI使用,甚至使用windows API?操作系统应该能够访问屏幕。我用“Windows10夜光api”关键字在互联网上搜索了一下,找到了。最近你在网上搜索过吗?@ThomasMatthews,你读过实际问题和答案的评论吗?;-)里面什么都没有。