更改 FriendlyName 注册表值后如何强制 Windows 设备管理器刷新设备名称显示

Posted

技术标签:

【中文标题】更改 FriendlyName 注册表值后如何强制 Windows 设备管理器刷新设备名称显示【英文标题】:How to force Windows Device Manager refresh device name display after I change FriendlyName registry value 【发布时间】:2016-08-29 07:46:23 【问题描述】:

Microsoft WDK 的 Toaster 示例代码包含一个 ClassInstaller 示例 (tostrcls.dll)。它显示了自定义设备管理器显示的“设备友好名称”的能力。该功能是通过修改设备 硬件密钥 的 FriendlyName 值来实现的。修改 FriendlyName 后,关闭并重新打开设备管理器窗口 (devmgmt.msc) 将反映此类更改。到现在为止还挺好。

但是,为了告诉设备管理器窗口立即反映更改(无需关闭并重新打开其窗口),必须运行一些额外的代码。 classInst.c采取以下方式:

spDevInstall.FlagsEx |= DI_FLAGSEX_PROPCHANGE_PENDING;

SetupDiSetDeviceInstallParams(Params->DeviceInfoSet,
                              Params->DeviceInfoData,
                              &spDevInstall);

这可行,但不是最佳。 DI_FLAGSEX_PROPCHANGE_PENDING 使设备经历一个停止/启动周期。我的意思是,驱动程序的 ToasterEvtDeviceReleaseHardware 和 ToasterEvtDevicePrepareHardware 被执行。我认为这是一个不受欢迎的副作用。

所以我的问题很清楚。有没有办法不用驱动代码就可以刷新设备管理器的显示?

【问题讨论】:

【参考方案1】:

我从 WDK7 PnpPorts 项目(它是实现 Windows COM 端口“端口设置”​​选项卡的 ClassInstaller)中得到了答案。

只是改变

spDevInstall.FlagsEx |= DI_FLAGSEX_PROPCHANGE_PENDING;

spDevInstall.Flags |= DI_PROPERTIES_CHANGE;

全部完成。

注意:DI_FLAGSEX_PROPCHANGE_PENDING 的设备重启行为记录在 WDK7 chm 页面“DIF_ADDPROPERTYPAGE_ADVANCED”中,但不在“SP_DEVINSTALL_PARAMS”中。我只检查了后者,所以错过了。

【讨论】:

以上是关于更改 FriendlyName 注册表值后如何强制 Windows 设备管理器刷新设备名称显示的主要内容,如果未能解决你的问题,请参考以下文章

新用户注册/密码更改后强制注销

新用户注册/密码更改后强制注销

更改 Scaffold.body 值后如何在颤动中隐藏抽屉

如何在文本框中输入值后单击输入更改图像?

选择值后强制 FilteringSelect 失去焦点

如何强制我的 C# 应用程序立即确认 TCP 数据报?