C#在操作系统中设置环境变量windows(不执行)

C# Set environment variable in operative system windows (out of execution)

我需要像 windows 中现有的那样添加一个 Windows 环境变量。我的意思是:

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

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

我正在制作一个简单的 Winform 应用程序,使用 C#

可以轻松创建 windows 环境变量

我试过了:

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

我试过 this 但都没有:

    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 docs - Other link here ...

EnvironmentVariableTarget.Machine 似乎根本没有帮助。

如果这个过程成功,我将能够在 cmd.exe

echo %test% // and outputs "testvalue"

请记住,当用户单击按钮并且我在 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/w-p/win32/tutorials/article.php/c10849/Setting-a-System-Environment-Variable.htm

通过在此键下创建新值或修改已存在的值来添加变量。要删除一个变量,您只需删除它的注册表值,除非您要删除扩展值的一部分,例如 PATH,在这种情况下,您只需要删除您想要的部分。

此时,Windows 将不会知道您的更改,除非您注销或重新启动。为了解决这个问题,SetEnv 将向系统中的所有 windows 广播 WM_SETTINGCHANGE。这允许其他 运行ning 应用程序(例如,Explorer.exe)收到您的更改通知。 如果您从命令提示符 运行 SetEnv,这不会更新当前 DOS 的环境变量 window。这主要是因为进程 (SetEnv) 无法更改其父进程(命令提示符)的环境。但是,您打开的任何新 DOS/Command 提示都将显示新的 variable/value.

广播此消息会导致大约 2-3 秒的轻微延迟(同时打开 windows 处理它),因此看起来 SetEnv 已挂起。事实并非如此。

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