使用脚本更改Windows中的色度子采样设置(YCbCr 4:4:4为RGB,反之亦然)(Python)
一点背景:我正在编写一个程序来自动测试监视器。为此,我想在不必通过英伟达控制面板每次手动切换NFIDIA控制面板的情况下,立即改变显示设置(分辨率、刷新率等)。p> 我发现NirCmd实用程序允许您通过命令行更改其中一些设置,所以我的第一个想法是使用它。不幸的是,它无法修改更高级的参数,如色度子采样(“NVIDIA控制面板中的输出颜色格式”)、输出动态范围或输出颜色深度 然后,我想使用我的程序直接修改注册表值,并通过调用ChangeDisplaySettings()更新设置。在Windows上使用ProcMon,我通过更改显示设置来识别哪些键被修改,然后在调用ChangeDisplaySettings()读取键并显示新设置之前,直接用Python更改它们。感觉有点像用大炮杀死蚂蚁,但它在很大程度上起了作用:我可以用这种方法改变分辨率、刷新率、桌面颜色深度和显示窗口大小 以下是我正在使用的代码的相关部分(请注意,此代码需要修改以在特定计算机上运行,因为“LAPTOP\u ID”和“DESKTOP\u ID”注册表项是唯一的): 然而,我并没有走得更远,因为我仍然无法找到并更改控制更高级显示设置的按键。看起来它们不是Nvidia在注册表中存储的,所以我被卡住了。正如你所看到的,我确实找到了一个名为“CurrimeContConfg”的键,当英伟达控制面板中的输出颜色格式发生变化时,它被修改了,但实际上它似乎并没有被直接使用。使用脚本更改Windows中的色度子采样设置(YCbCr 4:4:4为RGB,反之亦然)(Python),python,windows,nvidia,Python,Windows,Nvidia,一点背景:我正在编写一个程序来自动测试监视器。为此,我想在不必通过英伟达控制面板每次手动切换NFIDIA控制面板的情况下,立即改变显示设置(分辨率、刷新率等)。p> 我发现NirCmd实用程序允许您通过命令行更改其中一些设置,所以我的第一个想法是使用它。不幸的是,它无法修改更高级的参数,如色度子采样(“NVIDIA控制面板中的输出颜色格式”)、输出动态范围或输出颜色深度 然后,我想使用我的程序直接修改注册表值,并通过调用ChangeDisplaySettings()更新设置。在Windows上使
我也尝试了英伟达SDK,但发现它超出了我作为程序员的能力…
欢迎任何意见!(包括摆脱难看的连续chr()强制转换的方法)提供了对源模式和目标模式更大的控制。如果您对所涉及的嵌套结构有点不知所措,我建议您手动将系统置于您想要的配置中,然后使用该配置获取当前配置。将每个配置保存在某个位置,然后让测试应用程序加载它们并将它们传递到SetDisplayConfig。提供了对源模式和目标模式的更大控制。如果您对所涉及的嵌套结构有点不知所措,我建议您手动将系统置于您想要的配置中,然后使用该配置获取当前配置。将每个配置保存在某个地方,然后让测试应用程序加载它们并将它们传递到SetDisplayConfigfrom Tkinter import *
import tkFont
import time
import ctypes
import serial
import _winreg
import win32gui
import win32con
import win32api
import wmi
def get_reg(name, reg_path):
registry_key = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, reg_path, 0, _winreg.KEY_READ)
value, regtype = _winreg.QueryValueEx(registry_key, name)
_winreg.CloseKey(registry_key)
return value
def set_reg(name, value, reg_path):
registry_key = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, reg_path, 0, _winreg.KEY_WRITE)
_winreg.SetValueEx(registry_key, name, 0, _winreg.REG_DWORD, value)
_winreg.CloseKey(registry_key)
def set_reg_bin(name, value, reg_path):
registry_key = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, reg_path, 0, _winreg.KEY_WRITE)
_winreg.SetValueEx(registry_key, name, 0, _winreg.REG_BINARY, value)
_winreg.CloseKey(registry_key)
def reg_enum(reg_path):
registry_key = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, reg_path, 0, _winreg.KEY_READ)
lastkey=_winreg.EnumKey(registry_key, _winreg.QueryInfoKey(registry_key)[0]-1)
firstkey=_winreg.EnumKey(registry_key, 0)
print lastkey
print firstkey
return lastkey
def deleteSubkey(key0, key1, key2=""):
if key2=="":
currentkey = key1
else:
currentkey = key1+ "\\" +key2
open_key = _winreg.OpenKey(key0, currentkey ,0,_winreg.KEY_ALL_ACCESS)
infokey = _winreg.QueryInfoKey(open_key)
for x in range(0, infokey[0]):
subkey = _winreg.EnumKey(open_key, 0)
try:
_winreg.DeleteKey(open_key, subkey)
print "Removed %s\\%s " % ( currentkey, subkey)
except:
deleteSubkey( key0, currentkey, subkey )
_winreg.DeleteKey(open_key,"")
open_key.Close()
print "Removed %s" % (currentkey)
return
if __name__ =="__main__":
DESKTOP_ID = "{########-####-####-####-############}"
LAPTOP_ID = "{########-####-####-####-############}"
REG_PATH_SCRID = r"SYSTEM\CurrentControlSet\Control\GraphicsDrivers\Configuration"
deleteSubkey(_winreg.HKEY_LOCAL_MACHINE, REG_PATH_SCRID)
try:
input = raw_input('In Windows Display settings, under "Multiple displays", choose "Show only on 2", then press ENTER to continue.')
except NameError:
pass
win32api.ChangeDisplaySettings(None, 0)
ColorRGB = chr(0x00)+chr(0x00)+chr(0x00)+chr(0x00)+chr(0x0A)+chr(0x01)+chr(0x08)+chr(0x00)
Color422 = chr(0x01)+chr(0x00)+chr(0x00)+chr(0x00)+chr(0x0A)+chr(0x01)+chr(0x08)+chr(0x00)
Color444 = chr(0x02)+chr(0x00)+chr(0x00)+chr(0x00)+chr(0x0A)+chr(0x01)+chr(0x08)+chr(0x00)
Color420 = chr(0x03)+chr(0x00)+chr(0x00)+chr(0x00)+chr(0x0A)+chr(0x01)+chr(0x08)+chr(0x00)
ColorRGB_DriverExtra = chr(0x60)+chr(0xEA)+chr(0x00)+chr(0x00)+chr(0xE8)+chr(0x03)+chr(0x00)+chr(0x00)+chr(0x15)+chr(0x00)+chr(0x00)+chr(0x00)+chr(0x04)+chr(0x00)+chr(0x00)+chr(0x00)+chr(0x00)+chr(0x00)+chr(0x00)+chr(0x00)+chr(0x06)+chr(0x00)+chr(0x00)+chr(0x00)
Color444_DriverExtra = chr(0x60)+chr(0xEA)+chr(0x00)+chr(0x00)+chr(0xE8)+chr(0x03)+chr(0x00)+chr(0x00)+chr(0x15)+chr(0x00)+chr(0x00)+chr(0x00)+chr(0x04)+chr(0x00)+chr(0x00)+chr(0x00)+chr(0x00)+chr(0x00)+chr(0x00)+chr(0x00)+chr(0x06)+chr(0x00)+chr(0x00)+chr(0x00)
Color422_DriverExtra = chr(0x60)+chr(0xEA)+chr(0x00)+chr(0x00)+chr(0xE8)+chr(0x03)+chr(0x00)+chr(0x00)+chr(0x15)+chr(0x00)+chr(0x00)+chr(0x00)+chr(0x04)+chr(0x00)+chr(0x00)+chr(0x00)+chr(0x00)+chr(0x00)+chr(0x00)+chr(0x00)+chr(0x06)+chr(0x00)+chr(0x00)+chr(0x00)
Color422_DriverExtra = chr(0x60)+chr(0xEA)+chr(0x00)+chr(0x00)+chr(0xE8)+chr(0x03)+chr(0x00)+chr(0x00)+chr(0x15)+chr(0x00)+chr(0x00)+chr(0x00)+chr(0x04)+chr(0x00)+chr(0x00)+chr(0x00)+chr(0x00)+chr(0x00)+chr(0x00)+chr(0x00)+chr(0x06)+chr(0x00)+chr(0x00)+chr(0x00)
SCREEN_ID = reg_enum(REG_PATH_SCRID)
print SCREEN_ID
SCREEN_ID_SHORT = SCREEN_ID.partition("^")[0]
print SCREEN_ID_SHORT
REG_PATH = r"SYSTEM\CurrentControlSet\Hardware Profiles\UnitedVideo\CONTROL\VIDEO"+"\\"+LAPTOP_ID+r"\0000"
REG_PATH2 = r"SYSTEM\CurrentControlSet\Hardware Profiles\UnitedVideo\CONTROL\VIDEO"+"\\"+LAPTOP_ID+r"\0001"
REG_PATH3 = r"SYSTEM\CurrentControlSet\Control\GraphicsDrivers\Configuration"+"\\"+SCREEN_ID+r"\00\00"
REG_PATH4 = r"SYSTEM\CurrentControlSet\Control\GraphicsDrivers\Configuration"+"\\"+SCREEN_ID+r"\00"
REG_PATH5 = r"SYSTEM\CurrentControlSet\Control\GraphicsDrivers\Configuration"+"\\"+SCREEN_ID
REG_PATH_COLOR = r"SYSTEM\CurrentControlSet\Services\nvlddmkm\DisplayDatabase"+"\\"+SCREEN_ID_SHORT
set_reg('DefaultSettings.XResolution', 3840, REG_PATH)
set_reg('DefaultSettings.YResolution', 2160, REG_PATH)
set_reg_bin('DefaultSettings.DriverExtra', ColorRGB_DriverExtra, REG_PATH)
set_reg('DefaultSettings.VRefresh', 60, REG_PATH)
set_reg_bin('ColorformatConfig', ColorRGB, REG_PATH_COLOR)
set_reg('Attach.ToDesktop', 1, REG_PATH)
set_reg('VSyncFreq.Numerator', 60000, REG_PATH3)
set_reg('VSyncFreq.Denominator', 1000, REG_PATH3)
set_reg('PrimSurfSize.cx', 3840, REG_PATH3)
set_reg('PrimSurfSize.cy', 2160, REG_PATH3)
set_reg('DwmClipBox.left', 0, REG_PATH3)
set_reg('DwmClipBox.top', 0, REG_PATH3)
set_reg('DwmClipBox.right', 3840, REG_PATH3)
set_reg('DwmClipBox.bottom', 2160, REG_PATH3)
set_reg('PrimSurfSize.cx', 3840, REG_PATH4)
set_reg('PrimSurfSize.cy', 2160, REG_PATH4)
win32api.ChangeDisplaySettings(None, 0)