通过修改注册表强制更新Windows中显示器音频设备名的方法

目前主流的显示器接口标准HDMI和DisplayPort都支持音频,具有这两种接口的显示器在连接到Windows电脑后,点击桌面右下角的小喇叭图标可以在音频设备列表中看到对应于显示器的音频播放设备。

从事显示器(包括某些HMD设备)研发的朋友都知道EDID (Extended Display Identification Data),也就是一组用于描述显示器特性和参数的结构化数据,一般存储在显示器的firmware中。EDID中有4个字节用于标识显示器的生产厂家和产品型号,包括2个字节的Manufacturer ID(也叫Vendor ID或Plug and Play ID,由微软统一分配)和2个字节的Product Code(由厂家自行分配),每一款在市场上销售的显示器,这4个字节不会出现重复。此外EDID中还可以定义显示器名称(Monitor Name),这是一个包含最长13个ASCII字符的字符串,是用来给人看的。当具有HDMI或DP接口的显示器连接到Windows电脑后,在“显示设置”里看到的显示器名称,以及上面提到的点击桌面右下角小喇叭图标看到的显示器音频设备名都是这个Monitor Name。当显示器连接到Windows电脑,系统会读取和解析EDID并将相关数据保存记录到注册表中。

对于显示器厂家,Manufacturer ID一般是固定的,所有机型都相同,而Product Code每种机型都不一样,一般在产品研发初期就会确定下来并且直到上市不会变更。Monitor Name由于是给人看的,相对比较灵活,有可能在研发过程中发生变更。我们发现一个问题,就是如果一个显示器它的EDID里面的Product Code保持不变,而仅是Monitor Name发生变化,当它重新连到Windows电脑后,在“显示设置”里面看到的显示器名称是跟随Monitor Name的变化而改变的,这是符合预期的,然而点击桌面右下角小喇叭图标看到的显示器音频设备名却不会随之更新,它仍是先前的Monitor Name,除非每次修改Monitor Name都同时改变Product Code也就是让Windows认为换了一台不同的显示器才能将这个音频设备名更新成新的Monitor Name。这个问题在Windows 10和11上都存在,显然在“显示设置”和音频设备列表这两个地方获取设备名的处理逻辑是不一致的,前者每次都从EDID中重新获取Monitor Name作为显示器名称来显示,新的Monitor Name会立即生效,而后者是先在注册表中查找Manufacturer ID和Product Code(即前述的那4个字节数据),如果发现是先前已经记录过的就认为连接的仍是同一台显示器,直接从注册表里读取先前保存的Minitor Name作为显示器音频设备名来显示,而不是从EDID中更新。

笔者认为这是Windows的一个小小的bug,微软没有考虑到显示器厂家研发过程中可能会出现Product Code不变但需要调整Monitor Name的情形(当然这种需求也确实比较冷门),给研发和测试带来一些麻烦。

为了解决这个问题,笔者在网上搜寻,发现有一种方法是在系统设置界面里手工修改显示器音频设备名,具体方法可以参考这篇文章:https://www.howtogeek.com/757046/how-and-why-to-rename-audio-devices-in-windows-10/#moka_anchor_speakers 当然这个方法也可以通过修改注册表来实现。但这个方案显然有点蠢,等于是EDID中的Monitor Name不起作用了,全靠手工在Windows端自己改名字。

有没有更好的办法?首先尝试了在设备管理器中卸载显示器设备和显示器音频设备但无效,那么能否清除注册表中保存的先前连接过的显示器信息,强制让Windows从EDID中更新显示器音频设备名?笔者在网上没有找到现成答案,只能自己试了。

发现跟显示器相关的注册表项要么没有权限去删除,要么删掉后并不解决问题。经过很多尝试和验证,终于找到了简单又有效的办法,直接将结果分享给大家:

1. 打开注册表编辑器,定位到路径"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\MMDevices\Audio\Render\",这下面列出了用GUID区分的所有连接过的音频播放设备,每个设备下面都有Properties,在里面保存了设备的所有属性;

2. 依次查找每个设备,如果是显示器音频设备,那么在Properties下面会找到名为"{b3f8fa53-0004-438e-9003-51a46e139bfc},10"的key,它的value就是该显示器的Manufacturer ID和Product Code(即前述的那4个字节数据),还有一个名为"{a45c254e-df1c-4efd-8020-67d146a850e0},2"的key,它的value是该显示器的Monitor Name,参考下图示例;

3. 删除名为"{b3f8fa53-0004-438e-9003-51a46e139bfc},10"的key;

4. 断开显示器,然后重新连接显示器。

大功告成,此时点击桌面右下角的小喇叭图标可以看到显示器音频设备名已更新。

上面的操作步骤可以用程序实现,笔者已经用Visual C++写了一个小工具完成上述操作。

最后顺带提一下,在Windows 11上,在设备管理器的“监视器”下面看到的显示器设备名也存在类似的问题,即如果一个显示器它的EDID里面的Product Code保持不变,而仅是Monitor Name发生变化,那么在设备管理器的“监视器”下面看到的显示器设备名也是不会更新的。这个问题只在 Windows 11 上有,因为在 Windows 10 上设备管理器这个地方是不会显示设备名的。解决办法很简单,在设备管理器的“监视器”下面对该显示器手工执行“卸载设备”然后重新连接显示器即可。也可以修改注册表来解决,不过还不如卸载设备来得简单。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值