const int HWND_BROADCAST = 0xffff;
const int WM_SETTINGCHANGE = 0x001A;
public enum SendMessageTimeoutFlags : uint
{
SMTO_NORMAL = 0x0000,
SMTO_BLOCK = 0x0001,
SMTO_ABORTIFHUNG = 0x0002,
SMTO_NOTIMEOUTIFNOTHUNG = 0x0008
}
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
public static extern IntPtr SendMessageTimeout(IntPtr hWnd, uint Msg, IntPtr wParam, string lParam,
SendMessageTimeoutFlags flags, uint timeout, out IntPtr result);
static void SetUserPath(string path) //设置用户环境变量
{
RegistryKey registryKey = Registry.CurrentUser.OpenSubKey(@"Environment", true);
Console.WriteLine("Path: {0} {1}", registryKey.GetValue("Path"), registryKey.GetValueKind("Path"));
registryKey.SetValue("Path", registryKey.GetValue("Path") + path, RegistryValueKind.ExpandString);
SendMessageTimeout(new IntPtr(HWND_BROADCAST), WM_SETTINGCHANGE, IntPtr.Zero, "Environment",
SendMessageTimeoutFlags.SMTO_ABORTIFHUNG, 5000, out IntPtr result);
Console.WriteLine("result: {0}", result);
}
static void SetSystemPath(string path) //设置系统环境变量
{
String subKeyPath = @"SYSTEM\CurrentControlSet\Control\Session Manager\Environment";
RegistryKey registryKey = Registry.LocalMachine.OpenSubKey(subKeyPath, true); //需要管理员权限运行
Console.WriteLine("Path: {0} {1}", registryKey.GetValue("Path"), registryKey.GetValueKind("Path"));
registryKey.SetValue("Path", registryKey.GetValue("Path") + path, RegistryValueKind.ExpandString);
SendMessageTimeout(new IntPtr(HWND_BROADCAST), WM_SETTINGCHANGE, IntPtr.Zero, "Environment",
SendMessageTimeoutFlags.SMTO_ABORTIFHUNG, 5000, out IntPtr result);
Console.WriteLine("result: {0}", result);
}
//手动修改环境变量时,系统自动维护其类型,长度较短时为REG_SZ(String),达到一定长度后为REG_EXPAND_SZ(ExpandString)
//REG_SZ型注册表值项的名称是长度固定的文本字符串,最大长度不能超过255个字符;REG_EXPAND_SZ是长度可变的数据字符串。
SetUserPath(@"C:\tcc");
SetSystemPath(@"C:\tcc"); //需要管理员权限