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