我正在用c++编写一个程序,该程序将一个新目录添加到系统的路径环境变量中。使用RegSetValueEx()
功能成功添加了目录,但这些更改并没有反映在所有进程中。
我已经分别尝试了BroadcastSystemMessage()
和SendMessageTimeout()
功能,如下
LPCTSTR keyPath = TEXT("System\CurrentControlSet\Control\Session Manager\Environment");
BroadcastSystemMessage(0, 0, WM_SETTINGCHANGE, 0, (LPARAM)keyPath);
和
LPCTSTR keyPath = TEXT("System\CurrentControlSet\Control\Session Manager\Environment");
SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0, (LPARAM)keyPath, SMTO_BLOCK, 100, NULL);
但它们都不起作用,但是当我重新启动系统时,这些变化就会反映出来。
我想要什么
我希望在没有注销的情况下,所有流程都能反映出这些更改,并且可能在几天前我安装了一个软件(Composerhttps://getcomposer.org)添加了其环境路径并刷新了所有进程的环境变量,而无需重新启动系统。
以下是一些有用的链接,我已经看过
- 设置其他进程(如cmds(可见的c++代码中的当前用户环境变量
- 在Windows中,是否有从命令提示符刷新环境变量的命令
我发现我做错了什么,我在使用
LPCTSTR keyPath = TEXT("System\CurrentControlSet\Control\Session Manager\Environment");
SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0, (LPARAM)keyPath, SMTO_BLOCK, 100, NULL);
什么时候应该是
LPCTSTR keyPath = TEXT("Environment");
SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0, (LPARAM)keyPath, SMTO_BLOCK, 100, NULL);
并且这在不重新启动的情况下刷新了其他进程的环境变量。