在机器范围内以编程方式设置环境变量并发送设置更改消息

Set an Environment Variable Programatically in the Machine Scope and send SettingsChange Message

我有一些代码可以在 MACHINE、USER 和 PROCESS 范围内设置环境变量。

用户和进程按预期执行,但出于某种原因,当我尝试验证机器范围变量时,未找到它。

我设置环境变量的代码非常简单:

Environment.SetEnvironmentVariable("foo1", "bar1", EnvironmentVariableTarget.Machine);
Environment.SetEnvironmentVariable("foo2", "bar2",   EnvironmentVariableTarget.User);
Environment.SetEnvironmentVariable("foo3", "bar3", EnvironmentVariableTarget.Process);

我是不是漏掉了什么?

更新

我正在尝试使用发送 WM_SETTINGCHANGE 消息时所述的内容来解决问题。我很好奇添加这个是否允许 SetEnvironmentVariable 工作,或者唯一的方法是通过注册表。

我将尝试两种方法,看看哪个有效,到目前为止,我挂断了广播消息。据我所知,这是广播消息所需的语法

IntPtr HWND_BROADCAST = new IntPtr(0xFFFF);
const int WM_SETTINGCHANGE = 0x001A;
SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, null, "Environment");

为此,我使用了以下 dll 导入。

[DllImport("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, int wMsg, IntPtr wParam, String lParam);

设置机器级环境变量有点棘手。问题是这不会立即影响流程,因为它们已经 运行 在自己的环境中。在那里查看更多信息:https://serverfault.com/questions/8855/how-do-you-add-a-windows-environment-variable-without-rebooting 我不确定 Environment.SetEnvironmentVariable 是否会为您完成。