设为首页 加入收藏

TOP

设置环境变量遇到的难题,cmd管理员方式与普通方式的区别,通过C#代码设置环境变量(二)
2019-09-04 00:59:49 】 浏览:122
Tags:设置 环境 变量 遇到 难题 cmd 管理员 方式 普通 区别 通过 代码
接修改注册表ControlSet001或CurrentControlSet(或HKCU\Environment),在系统设置-环境变量界面立即出现,
      但命令行窗口中只有以管理员权限运行才生效,普通模式必须重启才能生效(不重启的话每次打开cmd都得执行set命令才生效)。
      另:图形界面的路径删除后注册表和命令行窗口同时立即起作用,即路径同时消失,
      但注册表删除后,图形界面立即有效即消失,只有管理员命令行窗口立即有效,普通模式路径仍然可用,必须重启才能生效消失
      普通命令行窗口怎么才能立即生效呢,总是慢半拍,是何原因呢?
===================================================================
最近总算找到原因了,原来需要发一个全局的广播:
C\C++: SendMessage(HWND_BROADCAST,WM_SETTINGCHANGE,0,(LPARAM)TEXT("Environment"));
或者 SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0, (LPARAM)TEXT("Environment"), SMTO_ABORTIFHUNG, 5000, 0);
 C#里实现代码如下:
        const int HWND_BROADCAST = 0xffff;
        const int WM_SETTINGCHANGE = 0x001A;
        public enum SendMessageTimeoutFlags : uint
        {
            SMTO_NORMAL = 0x0000,
            SMTO_BLOCK = 0x0001,
            SMTO_ABORTIFHUNG = 0x0002,
            SMTO_NOTIMEOUTIFNOTHUNG = 0x0008
        }
        [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
        public static extern IntPtr SendMessageTimeout(IntPtr hWnd, uint Msg, IntPtr wParam, string lParam,
             SendMessageTimeoutFlags flags, uint timeout, out IntPtr result);
        static void SetUserPath(string path)   //设置用户环境变量
        {
            RegistryKey registryKey = Registry.CurrentUser.OpenSubKey(@"Environment", true);
            Console.WriteLine("Path: {0}  {1}", registryKey.GetValue("Path"), registryKey.GetValueKind("Path"));
            registryKey.SetValue("Path", registryKey.GetValue("Path") + path, RegistryValueKind.ExpandString);
            SendMessageTimeout(new IntPtr(HWND_BROADCAST), WM_SETTINGCHANGE, IntPtr.Zero, "Environment",
                SendMessageTimeoutFlags.SMTO_ABORTIFHUNG, 5000, out IntPtr result);
            Console.WriteLine("result: {0}", result);
        }

        static void SetSystemPath(string path)    //设置系统环境变量
        {
            String subKeyPath = @"SYSTEM\CurrentControlSet\Control\Session Manager\Environment";
            RegistryKey registryKey = Registry.LocalMachine.OpenSubKey(subKeyPath, true);   //需要管理员权限运行
            Console.WriteLine("Path: {0}  {1}", registryKey.GetValue("Path"), registryKey.GetValueKind("Path"));
            registryKey.SetValue("Path", registryKey.GetValue("Path") + path, RegistryValueKind.ExpandString);
            SendMessageTimeout(new IntPtr(HWND_BROADCAST), WM_SETTINGCHANGE, IntPtr.Zero, "Environment",
                SendMessageTimeoutFlags.SMTO_ABORTIFHUNG, 5000, out IntPtr result);
            Console.WriteLine("result: {0}", result);
        }
        //手动修改环境变量时,系统自动维护其类型,长度较短时为REG_SZ(String),达到一定长度后为REG_EXPAND_SZ(ExpandString)
        //REG_SZ型注册表值项的名称是长度固定的文本字符串,最大长度不能超过255个字符;REG_EXPAND_SZ是长度可变的数据字符串。

 调用代码:

        SetUserPath(@"C:\tcc");
        SetSystemPath(@"C:\tcc"); //需要管理员权限

 

首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Win10 1903 运行安卓模拟器蓝屏解.. 下一篇windows中service.msc与regedit

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目