该文档告诉您如何执行此操作。
调用SetEnvironmentVariable
对系统环境变量没有影响。要以编程方式添加或修改系统环境变量,请将它们添加到HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment
注册表项,然后广播一条设置为字符串的WM_SETTINGCHANGE
消息。这允许应用程序(例如 shell)获取您的更新。lParam
"Environment"
因此,您需要写入您已经尝试写入的注册表设置。WM_SETTINGCHANGE
然后如上所述广播一条消息。您需要以提升的权限运行才能成功。
一些示例代码:
using Microsoft.Win32;
using System;
using System.Diagnostics.Contracts;
using System.Runtime.InteropServices;
namespace ConsoleApplication1
{
class Program
{
const int HWND_BROADCAST = 0xffff;
const uint WM_SETTINGCHANGE = 0x001a;
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
static extern bool SendNotifyMessage(IntPtr hWnd, uint Msg,
UIntPtr wParam, string lParam);
static void Main(string[] args)
{
using (var envKey = Registry.LocalMachine.OpenSubKey(
@"SYSTEM\CurrentControlSet\Control\Session Manager\Environment",
true))
{
Contract.Assert(envKey != null, @"registry key is missing!");
envKey.SetValue("TEST1", "TestValue");
SendNotifyMessage((IntPtr)HWND_BROADCAST, WM_SETTINGCHANGE,
(UIntPtr)0, "Environment");
}
}
}
}
然而,虽然此代码确实有效,但 .net 框架提供了更简单地执行相同任务的功能。
Environment.SetEnvironmentVariable("TEST1", "TestValue",
EnvironmentVariableTarget.Machine);
三参数重载的文档说:Environment.SetEnvironmentVariable
如果目标是 EnvironmentVariableTarget.Machine,则环境变量存储在本地计算机注册表的 HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager\Environment 项中。它也被复制到文件资源管理器的所有实例中。然后,从文件资源管理器启动的任何新进程都会继承环境变量。
如果目标是用户或机器,则通过 Windows WM_SETTINGCHANGE 消息通知其他应用程序设置操作。