我需要像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#可以做到这一点吗?感谢任何帮助,谢谢
答案 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" );
}
从这里开始:
通过在此键下创建新值或通过修改值(如果已存在)来添加变量。要删除变量,只需删除其注册表值,除非您要删除部分扩展值,例如PATH,在这种情况下,您只删除所需的部分。
此时,除非您注销或重新启动,否则Windows将不会知道您的更改。为了解决这个问题,SetEnv将向系统中的所有窗口广播 WM_SETTINGCHANGE 。这允许其他正在运行的应用程序(例如,Explorer.exe)通知您的更改。 如果从命令提示符运行SetEnv,则不会更新当前DOS窗口的环境变量。这主要是因为进程(SetEnv)无法更改其父级(命令提示符)的环境。但是,您打开的任何新DOS /命令提示符都将显示新的变量/值。
广播此消息会导致稍微延迟(当打开的窗口处理它时)大约2-3秒,因此可能看起来SetEnv已挂起。事实并非如此。
我相信我已经注意到延迟,以及需要打开新命令提示符的问题。