问题
我使用了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
,且可能位于0000
、0001
或其他路径下。直接手动修改还是比较麻烦。
故我写了一个脚本用于自动化添加自定义分辨率
脚本
- 请您安装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
57import 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