有没有办法以编程方式编写 Windows 10 的“颜色过滤器”功能?

有没有办法以编程方式编写 Windows 10 的“颜色过滤器”功能?

我正在尝试让 Windows 10 模拟 Google 与 Android 9 一起发布的新“数字健康”功能。基本上,它会在夜间将屏幕更改为灰度,以试图激励人们放下手机去睡觉。

当我了解 Windows 10 的“颜色过滤器”功能(它还允许您将颜色配置文件设置为灰度)时,我认为编写脚本可能很容易,但我似乎找不到直接在脚本中执行此操作的方法。

目前,我基本上是通过打开Win+ Ctrl+C切换热键来使其工作,并设置了一个计划任务来运行 AutoHotkey 脚本,该脚本本质上是通过按下这些键来触发快捷方式。这可以正常工作,但我希望能够将快捷键保持禁用状态,这样我就不会意外按下它,或者有这么简单的方法来禁用该功能(并削弱“数字健康”效果)。此外,脚本无法知道设置的状态。如果它运行两次,它会自行撤消。目前我没有为机器编写脚本来取消设置该功能,但如果我创建了一个任务来执行此操作,并且在夜间触发之前关闭机器,它可能会在早上变成灰度。

我的问题是问是否有任何方法可以直接明确设置“打开颜色过滤器”或“关闭颜色过滤器”(通过 PowerShell、Batch、VBS 等),而不依赖于快捷键,最好不要切换?

答案1

所以我尝试了同样的事情并最终使用:https://zerowidthjoiner.net/negativescreen在灰度模式下,很容易通过编程触发。


在尝试之前,我遇到了一些有趣的事情。我尝试设置注册表项以启用颜色过滤:

 [HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Accessibility]
"Configuration"="colorfiltering"

[HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Accessibility\ATConfig]

[HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Accessibility\ATConfig\colorfiltering]
"Active"=dword:00000001
"FilterType"=dword:00000000

[HKEY_CURRENT_USER\Software\Microsoft\ColorFiltering]
"HotkeyEnabled"=dword:00000001
"Active"=dword:00000001
"FilterType"=dword:00000000

这本身不起作用,因为设置未应用。有趣的是,当我触发 UAC 弹出窗口时,颜色过滤器将被应用。因此通过调用

powershell Start-Process cmd.exe -Verb RunAs

可以通过编程方式应用该设置。但是这个解决方案很糟糕,因为会生成实际的 UAC 弹出窗口。

但是如果有人知道强制重绘窗口的另一种方法(或打开 UAC 时发生的任何事情),就应该能够以编程方式应用更改的设置。

答案2

我也有同样的需求。我用过自动热键为此。此脚本每 10 分钟检查一次。如果时间在晚上 10:30 - 10:39 之间,它会按Win+ Ctrl+ C

#Persistent
SetTimer, ToggleGreyscaleFilter, 600000     ; Check every 10 min
ToggleGreyscaleFilter:
TheTime = %A_Hour%%A_Min%
If TheTime Between 2230 and 2239            ; If it is between 10:30 and 10:39 pm
{
    MsgBox, "Sleep"                         ; Optional popup message
    Send #^c                                ; Press Win-Ctrl-C to toggle greyscale
}

为了实现此功能,请在“设置”>“轻松访问”>“颜色过滤器”中:

  • 允许使用快捷键打开或关闭过滤器 (Win-Ctrl-C)
  • 选择灰度过滤器

答案3

对于那些在 Windows 上寻找简单解决方案的人,您可以使用放大镜Python 3.8+ 库。它支持灰度颜色效果,并且您还可以使用它来制作动画过渡(通过随时间改变效果强度)。

import win_magnification as mag

mag_api = mag.WinMagnificationAPI()

# Set grayscale color filter
mag_api.fullscreen.color_effect.raw = mag.const.COLOR_GRAYSCALE_EFFECT

# Animate from normal to grayscale
import time

mag_api.fullscreen.color_effect.reset()
mag_api.fullscreen.color_effect.make_transition(
    end=mag.const.COLOR_GRAYSCALE_EFFECT,
    initial_power=0,
)

for i in range(100):
    mag_api.fullscreen.color_effect.transition_power += 0.01
    time.sleep(0.05)

相关内容