C# 更新环境变量 - SendMessageTimeout

标签 c# environment-variables

我正在尝试设置系统环境变量,我注意到要反射(reflect)更改,我必须执行 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

关于C# 更新环境变量 - SendMessageTimeout,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18603224/

相关文章:

c# - 如何允许用户在 MonoTouch 中选择视频?

django - 将 JSON 文件内容加载到 Heroku 环境变量

r - 如何从 R 中的流式 mapreduce 作业中获取文件名?

linux - 如何删除导出的环境变量?

c# - 在 c# 中使用 ssl 的 Google Cloud Sql 连接

c# - 为什么我不能选择排序这个库?

c# - 更改 PrinterSettings.Copies 不起作用

c# - 将多个 Azure 表查询封装在一个 HTTP Shot 中

python - 正确使用 Anaconda 的 Python 作为 PATH 的 "python"

python - 我如何告诉 POpen 使用/设置某些环境变量?