每次修改注册表之后如果想要立即见到效果的话都要重启explorer真是相当让人不爽,网上对于此类回答基本上就是重启explorer和重启系统。

        有很多功能,比如windows自身提供的一些设置选项,在用户进行了操作之后实际上也是操作的注册表,但是能够立即刷新而无须重启explorer(当然有些操作也是需要重启的)。那么也就是说肯定是有方法不用重启explorer就能实现立即生效的。

        因为我也没有太多的时间来系统的研究这一整套方法,经过几天的研究也算是找到了几种可行的刷新机制。下面列出来几条既为了整理记录也为了能够抛砖引玉。

        1. SystemParametersInfo函数。通过给第一个参数传入一个SET属性的参数可以实现部分系统刷新功能,例如:有一个小功能是设置win8窗口打开关闭时的动画效果,这个功能系统自带有设置选项,可以选择开启或者关闭,整个过程不需要重启explorer。具体实现方法就是修改了相应的注册表项后调用:SystemParametersInfo(SPI_SETANIMATION,sizeof(ANIMATIONINFO),&info,SPIF_SENDCHANGE); 其中info是一个ANIMATIONINFO结构体。

        关于这个系统函数有大量的参数可以使用,在此就不多罗列了。

        2. PostMessage/SendMessage函数。关于这俩函数肯定都很熟悉了,比如使用SendMessage(HWND_BROADCAST,WM_SETTINGCHANGE,0,0)可以广播设置变更消息,在很多场合上很有用;另外,后来研究过一段时间模拟右键刷新桌面的功能,网上有人使用模拟F5按键消息的方法个人感觉不太靠谱,一方面可能容易被安全软件截获,另一方面还要考虑存在某些软件修改F5功能的情况。后来在网上查到发送41504的WM_COMMAND消息就可以完美模拟刷新桌面消息:PostMessage(HWND_BROADCAST,WM_COMMAND,41504,NULL)。但是对于刷新本身都无法实现即时生效的注册表修改依然帮不上忙。

        3. 另外,SHChangeNotify函数也能实现一部分系统功能的刷新,但是由于在最近的项目上没有效果,就不细说了。