问题描述
我正在用C ++编写一个程序,该程序将新目录添加到系统的路径环境变量中。已使用RegSetValueEx()
函数成功添加了目录,但是更改并未反映在所有进程中。
我分别尝试了BroadcastSystemMessage()
和SendMessageTimeout()
函数,如下所示
LPCTSTR keyPath = TEXT("System\\CurrentControlSet\\Control\\Session Manager\\Environment");
BroadcastSystemMessage(0,WM_SETTINGCHANGE,(LPARAM)keyPath);
和
LPCTSTR keyPath = TEXT("System\\CurrentControlSet\\Control\\Session Manager\\Environment");
SendMessageTimeout(HWND_BROADCAST,(LPARAM)keyPath,SMTO_BLOCK,100,NULL);
但是它们都不起作用,但是当我重新启动系统时,更改会反映出来。
我想要的
我希望所有更改均能反映出来而无需注销,并且几天前我可能安装了软件(Composer https://getcomposer.org),该软件添加了其环境路径并刷新了所有进程的环境变量,而无需重新启动系统。
以下是我已经查看过的一些有用链接
- Set current user environment variable from c++ code visible to other process like cmds
- Is there a command to refresh environment variables from the command prompt in Windows?
解决方法
我弄清楚我在做什么,我在用
LPCTSTR keyPath = TEXT("System\\CurrentControlSet\\Control\\Session Manager\\Environment");
SendMessageTimeout(HWND_BROADCAST,WM_SETTINGCHANGE,(LPARAM)keyPath,SMTO_BLOCK,100,NULL);
应该在什么时候
LPCTSTR keyPath = TEXT("Environment");
SendMessageTimeout(HWND_BROADCAST,NULL);
,这无需重新启动即可刷新其他进程的环境变量。