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

时间:2015-08-07 11:29:39

标签: c# .net windows winforms environment

我需要像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#可以做到这一点吗?感谢任何帮助,谢谢

1 个答案:

答案 0 :(得分:2)

您可以尝试添加对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将向系统中的所有窗口广播 WM_SETTINGCHANGE 。这允许其他正在运行的应用程序(例如,Explorer.exe)通知您的更改。 如果从命令提示符运行SetEnv,则不会更新当前DOS窗口的环境变量。这主要是因为进程(SetEnv)无法更改其父级(命令提示符)的环境。但是,您打开的任何新DOS /命令提示符都将显示新的变量/值。

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

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

相关问题