使用Python在Win 10上切换“夜光”功能

3

我正在用Python制作一种快速访问程序。
因此,我需要使用Python打开和关闭夜灯功能。
在任何地方都没有找到相关内容。
提前致谢:)


1
你可以使用winapi来实现。这应该可以通过Python访问。下面是我找到的一个工作解决方案 github 你也可以找到一种直接通过命令提示符访问注册表并更改值的方法。干杯 - Samuel Middendorp
1
WinAPI没有起作用,没有错误,但是无论如何也没有启用夜光。请问您能解释一下第二种方法如何工作吗?非常感谢! - psycoxer
1
如果您不介意在注册表中执行操作,可以尝试此答案:与下面的答案相同,您可以访问命令提示符。请查看此链接:https://dev59.com/16nka4cB1Zd3GeqPVOCs - Samuel Middendorp
好东西,很高兴我能把你引导到正确的地方! - Samuel Middendorp
2个回答

2
您可以安装this Powershell函数,它允许您通过Powershell命令控制夜灯。然后,使用os.system(),您应该能够从Python脚本中调用该函数。

1
它对我有效(已点赞),但考虑到我需要将其分发给我的朋友,安装在所有机器上并不可行... - psycoxer
@psycoxer,您需要一个完全使用Python3+的解决方案吗? - Akib Rhast

0

这对我在Windows 10和Python 3.9上有效。

import winreg

STATUS_PATH = "Software\\Microsoft\\Windows\\CurrentVersion\\CloudStore\\Store\\DefaultAccount\\Current\\default$windows.data.bluelightreduction.bluelightreductionstate\\windows.data.bluelightreduction.bluelightreductionstate"
STATE_VALUE_NAME = "Data"


def get_night_light_state_data():
    try:
        hKey = winreg.OpenKey(winreg.HKEY_CURRENT_USER, STATUS_PATH, 0, winreg.KEY_READ)
        value, regtype = winreg.QueryValueEx(hKey, STATE_VALUE_NAME)
        winreg.CloseKey(hKey)

        if regtype == winreg.REG_BINARY:
            return value
    except:
        pass
    return False


def process_night_light_state_data(byte_array):
    night_light_is_on = False
    ch = byte_array[18]
    size = len(byte_array)

    if ch == 0x15:
        night_light_is_on = True
        for i in range(10, 15):
            ch = byte_array[i]
            if ch != 0xff:
                byte_array[i] += 1
                break
        byte_array[18] = 0x13
        for i in range(24, 22, -1):
            for j in range(i, size - 2):
                byte_array[j] = byte_array[j + 1]
    elif ch == 0x13:
        night_light_is_on = False
        for i in range(10, 15):
            ch = byte_array[i]
            if ch != 0xff:
                byte_array[i] += 1
                break
        byte_array[18] = 0x15
        n = 0
        while n < 2:
            for j in range(size - 1, 23, -1):
                byte_array[j] = byte_array[j - 1]
            n += 1
        byte_array[23] = 0x10
        byte_array[24] = 0x00
        # extend array
        ba = bytearray(1)
        ba[0] = 0x00
        byte_array.extend(ba)
        byte_array.extend(ba)
    return night_light_is_on


def write_data_to_registry(byte_array, night_light_state):
    size = len(byte_array)
    retval = False
    try:
        hKey = winreg.OpenKey(winreg.HKEY_CURRENT_USER, STATUS_PATH, 0, winreg.KEY_SET_VALUE)
        winreg.SetValueEx(hKey, STATE_VALUE_NAME, 0, winreg.REG_BINARY, byte_array[:size])
        winreg.CloseKey(hKey)
        retval = True
    except:
        pass
    return retval


if __name__ == '__main__':

    night_light_is_on = False
    value = get_night_light_state_data()
    size = len(value)
    reg_val = bytearray(size)
    reg_val[:] = value
    if get_night_light_state_data():
        night_light_new_settings = process_night_light_state_data(reg_val)
        write_data_to_registry(reg_val, night_light_new_settings)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接