问题

我使用了NVIDIA Tesla P40的vGPU功能,并分配给虚拟机用于Moonlight串流。但是使用自适应设备分辨率脚本却无效,发现是vGPU虚拟出来的显示器不支持串流客户端的分辨率,且在NVIDIA控制面板中的自定义分辨率按钮也是灰色无法添加自定义分辨率

解决

查阅资料发现可以通过设置HKLM\SYSTEM\CurrentControlSet\Control\Class\{4d36e968-e325-11ce-bfc1-08002be10318}\0000中的NV_Modes注册表值可以强制添加自定义分辨率。但是实测发现HKLM\SYSTEM\CurrentControlSet\Control\Class\下的注册表键值中有多个NV_Modes,且可能位于00000001或其他路径下。直接手动修改还是比较麻烦。
故我写了一个脚本用于自动化添加自定义分辨率

脚本

  • 请您安装python后使用
  • 理论上适用于所有NVIDIA显卡
  • 此脚本会操作您的注册表,请您在使用前仔细阅读每一行代码且备份您的注册表,请您务必知道这个脚本干了什么
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    import winreg

    def search_reg_key(reg_path, reg_key_name):
    result = []
    reg_key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, reg_path)
    sub_key_count, _, _ = winreg.QueryInfoKey(reg_key)
    for i in range(sub_key_count):
    try:
    sub_key_name = winreg.EnumKey(reg_key, i)
    sub_key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, f"{reg_path}\\{sub_key_name}")
    try:
    value, _ = winreg.QueryValueEx(sub_key, reg_key_name)
    result.append({
    'path':f"{reg_path}\\{sub_key_name}",
    'value': value
    })
    winreg.CloseKey(sub_key)
    continue
    except:
    winreg.CloseKey(sub_key)
    pass
    result.extend(search_reg_key(f"{reg_path}\\{sub_key_name}", reg_key_name))
    except:
    pass
    winreg.CloseKey(reg_key)
    return result

    def write_reg_key(reg_path, reg_key_name, reg_key_type, reg_key_value):
    key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, reg_path, 0, winreg.KEY_WRITE)
    print(reg_key_value)
    winreg.SetValueEx(key, reg_key_name, 0, reg_key_type, reg_key_value)
    winreg.CloseKey(key)

    reg_list = search_reg_key("SYSTEM\\CurrentControlSet\\Control\\Class", "NV_Modes")
    width = int(input("分辨率宽:"))
    height = int(input("分辨率高:"))
    new_resolution = f"{width}x{height}"

    now_resolution_list = []
    for reg_item in reg_list:
    flag = True
    for resolution_item in reg_item['value'][0].split(" "):
    if "x" not in resolution_item:
    continue
    resolution_value = "x".join(resolution_item.split("x")[0:2])
    if resolution_value == new_resolution:
    flag = False
    if resolution_value not in now_resolution_list:
    now_resolution_list.append(resolution_value)
    if flag:
    split_reg_value = reg_item['value'][0].split(" ")
    split_reg_value.insert(1, f"{new_resolution}x8,16,32,64")
    if input("是否写入注册表(y/n)") != "y":
    exit()
    write_reg_key(reg_item['path'], "NV_Modes", winreg.REG_MULTI_SZ, [" ".join(split_reg_value)])

    print(f"写入前支持的分辨率: {now_resolution_list}")

广告
广告正在加载中...
暂不开放评论,如对本文有任何疑问或建议,请联系apple@mr-wu.top
All Tags