以编程方式设置全球环境变量

Setting global environment variables programmatically

本文关键字:环境变量 设置 编程 方式      更新时间:2023-10-16

我需要以编程方式设置环境变量。

Microsoft在此提供了文档。您只需要在HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSession ManagerEnvironment下的注册表中创建一个新值即可。该部分工作正常。

问题是这些更改仅在登录并再次登录后生效。

到达电路,他们建议执行这一小代码:

if (!SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0,
    (LPARAM) "Environment", SMTO_ABORTIFHUNG,
    5000, &dwReturnValue))
{
  ... take action in case of failure
}

我做到了这一点,SendMessageTimeout返回TRUE,但至少在Windows 10下,它没有效果。新打开的命令提示符窗口仍然不会显示新创建的变量。

我还尝试在高架过程中运行此代码,但结果仍然相同。

但是,当我使用系统applet更改环境变量时,我新创建的变量显示出来,当我在applet上单击确定时,当我打开另一个命令提示符时,该变量就在那里。

有什么想法?

通过明确调用 SendMessageTimeout wide 版本来解决问题,并将"Environment"作为 wide string发送: string:

SendMessageTimeoutW(HWND_BROADCAST, WM_SETTINGCHANGE, 0, 
                   (LPARAM)L"Environment", SMTO_ABORTIFHUNG, 5000, &dwReturnValue);

正如迈克尔发现的那样,字符串宽度需要匹配A/W功能类型。WM_SETTINGCHANGE< WM_USER范围内,将由Window Manager填写。

如果您不想硬编码函数名称后缀:

SendMessageTimeout(
  HWND_BROADCAST,
  WM_SETTINGCHANGE, 
  0, 
  (LPARAM) TEXT("Environment"),
  SMTO_ABORTIFHUNG,
  5000,
  &dwReturnValue
);