在C++中刷新所有进程的系统环境变量而不注销/重新启动



我正在用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);

并且这在不重新启动的情况下刷新了其他进程的环境变量。

最新更新