C#更新环境变量-SendMessageTimeout

C#更新环境变量-SendMessageTimeout,c#,environment-variables,C#,Environment Variables,我试图设置一个系统环境变量,我注意到为了反映更改,我必须执行SendMessageTimeout来更新窗口 我可以让它运行,并返回一个0结果,但环境变量从未实际更新过 [Flags] public enum SendMessageTimeoutFlags : uint { SMTO_NORMAL = 0x0, SMTO_BLOCK = 0x1, SMTO_ABORTIFHUNG = 0x2, SMTO_NOTIMEOUTIFNOTHUNG = 0x8 } [Dl

我试图设置一个系统环境变量,我注意到为了反映更改,我必须执行SendMessageTimeout来更新窗口

我可以让它运行,并返回一个0结果,但环境变量从未实际更新过

[Flags]
public enum SendMessageTimeoutFlags : uint
{
    SMTO_NORMAL = 0x0,
    SMTO_BLOCK = 0x1,
    SMTO_ABORTIFHUNG = 0x2,
    SMTO_NOTIMEOUTIFNOTHUNG = 0x8
}

[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
public static extern IntPtr SendMessageTimeout(
IntPtr hWnd,
uint Msg,
UIntPtr wParam,
IntPtr lParam,
SendMessageTimeoutFlags fuFlags,
uint uTimeout,
out UIntPtr lpdwResult);


string reg_subkey = "Test1";
string reg_name = @"HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment";
Registry.SetValue(reg_name, reg_subkey, "testing", RegistryValueKind.String);

IntPtr HWND_BROADCAST = new IntPtr(0xffff);
const uint WM_WININICHANGE = 0x001A;
const uint WM_SETTINGCHANGE = WM_WININICHANGE;
const int MSG_TIMEOUT = 15000;
UIntPtr RESULT;

string ENVIRONMENT = "Environment";

SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, UIntPtr.Zero, (IntPtr)Marshal.StringToHGlobalAnsi(ENVIRONMENT), SendMessageTimeoutFlags.SMTO_ABORTIFHUNG, MSG_TIMEOUT, out RESULT);

最简单的方法是使用
Environment.SetEnvironmentVariable
。这会在内部调用
SendMessageTimeout

我会尝试使用
Environment.SetEnvironmentVariable
函数,然后是
SendMessageTimeout
,这在我的团队测试机器上下文中更新PATH变量时起到了作用。我们还发现与文档相反的是,
Environment.SetEnvironmentVariable
仅在创建新变量时才能自行工作。我们在一个场景中进行测试,其中父进程必须获得更新的PATH变量。

是的,这是一种更简单的方法。