C#在操作系统窗口中设置环境variables(不执行)

我需要添加一个Windows环境variables,如现有的Windows。 我的意思是 :

当您在cmd.exe中运行以下行时:

echo %appdata% //outputs something like C:/Users/blablabla // It's saved in windows by default ! 

我正在做一个简单的Winform应用程序,使用C#创buildWindows环境variables很容易

我努力了 :

  System.Environment.SetEnvironmentVariable("test", "testvalue", EnvironmentVariableTarget.Machine); 

我试过这个,但都没有:

  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); using (var envKey = Registry.LocalMachine.OpenSubKey( @"SYSTEM\CurrentControlSet\Control\Session Manager\Environment", true)) { Contract.Assert(envKey != null, @"registry key is missing!"); envKey.SetValue("artyom", "TestValue"); SendNotifyMessage((IntPtr)HWND_BROADCAST, WM_SETTINGCHANGE, (UIntPtr)0, "Environment"); } // it is assumed after this , the list should display this value, but nothing happens ! No exceptions, nothing 

并阅读:

MSDN文档 – 其他链接在这里…

EnvironmentVariableTarget.Machine似乎没有任何帮助。

如果这个过程是成功的,我将能够在cmd.exe中做到这一点

 echo %test% // and outputs "testvalue" 

请记住,我正在testing所有这些代码,当用户点击一个button,我在WinForms的工作可以用C#做​​到这一点? 任何帮助表示赞赏,谢谢

您可以尝试添加对NotifyUserEnvironmentVariableChanged的调用 – 但我认为我有混合的结果。

  [DllImport( "user32.dll", SetLastError = true, CharSet = CharSet.Auto )] static extern bool SendNotifyMessage( IntPtr hWnd, uint Msg,UIntPtr wParam, string lParam ); public static void NotifyUserEnvironmentVariableChanged() { const int HWND_BROADCAST = 0xffff; const uint WM_SETTINGCHANGE = 0x001a; SendNotifyMessage( ( IntPtr )HWND_BROADCAST, WM_SETTINGCHANGE, ( UIntPtr )0, "Environment" ); } 

从这里:

http://www.codeguru.com/cpp/wp/win32/tutorials/article.php/c10849/Setting-a-System-Environment-Variable.htm

变量是通过在这个键下创建一个新的值或者如果它已经存在的话修改一个值来添加的。 要删除变量,只需删除其注册表值,除非要删除部分扩展值(如PATH),在这种情况下,只需删除所需的部分。

此时,除非您注销或重新启动,否则Windows将不会意识到您的更改。 为了解决这个问题,SetEnv将广播一个WM_SETTINGCHANGE到系统中的所有窗口。 这允许其他正在运行的应用程序(例如Explorer.exe)被通知您的更改。 如果从命令提示符运行SetEnv,则不会更新当前DOS窗口的环境变量。 这主要是由于一个进程(SetEnv)不能改变其父进程的环境(命令提示符)。 但是,您打开的任何新的DOS /命令提示符将显示新的变量/值。

广播这个消息会导致2-3秒左右的延迟(而打开的窗口处理它),所以看起来SetEnv已经挂起。 不是这种情况。

我相信我已经注意到延迟以及需要打开新的命令提示符的问题。