zoukankan      html  css  js  c++  java
  • c# .net 编程方式修改环境变量无效的解决办法

    无论是修改注册表方式(SystemControlSet001ControlSession ManagerEnvironment"),还是用Environment.SetEnvironmentVariable() 方法,其实最后只差一步。通知。

    否则,只能重启操作系统生效。

    网上一般这样调用的

    SendMessageTimeout(
                         new IntPtr(HWND_BROADCAST), 
                         WM_SETTINGCHANGE, 
                         IntPtr.Zero, 
                         IntPtr.Zero,
                         SendMessageTimeoutFlags.SMTO_NORMAL,
                         1000,
                         out result1);

    超时不说,还无效。

    在微软上搜索了一篇:http://social.msdn.microsoft.com/Forums/vstudio/zh-CN/2b9c995f-5ece-4cfd-83b2-fe84c96427a3/net-set-new-path-with-setenvironmentvariable?forum=netfxbcl

    是这样调用的。

    SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, IntPtr.Zero, "Environment", SMTO_ABORTIFHUNG, 100, IntPtr.Zero);

    注意那个参数:"Environment"。

    using System;
    using System.Runtime.InteropServices;
    
    namespace UsualLib
    {
        public class NotifyOS
        {
            // SendMessageTimeout tools
            [Flags]
            public enum SendMessageTimeoutFlags : uint
            {
                SMTO_NORMAL = 0x0000,
                SMTO_BLOCK = 0x0001,
                SMTO_ABORTIFHUNG = 0x0002,
                SMTO_NOTIMEOUTIFNOTHUNG = 0x0008
            }
            const int WM_SETTINGCHANGE = 0x001A;
            const int HWND_BROADCAST = 0xffff;
    
            [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
            public static extern IntPtr SendMessageTimeout(
               IntPtr windowHandle,
               uint Msg,
               IntPtr wParam,
               string lParam,
               SendMessageTimeoutFlags flags,
               uint timeout,
               out IntPtr result
               );
    
            public static void NotifyOS1()
            {
                IntPtr result1;
                //修改后发送一个消息给系统 
                //调用
                SendMessageTimeout(
                                     new IntPtr(HWND_BROADCAST),
                                     WM_SETTINGCHANGE,
                                     IntPtr.Zero,
                                     "Environment",
                                     SendMessageTimeoutFlags.SMTO_ABORTIFHUNG,
                                     200,
                                     out result1);
            }
        }
    }

    最后,正常生效了。

    写个设置JDK、ANDROID SDK的小工具,可闹腾了些天。

  • 相关阅读:
    select,radio,checkbox的美化
    BBMASTER 博客
    thymeleaf教程
    Spring Boot入门01
    thymeleaf
    [转]Eclipse中10个最有用的快捷键组合
    SpringMVC实现文件上传
    Maven_项目管理利器入门
    [转]centos6.5安装mysql
    YOUNG博客项目设计书_v01.00_账号管理模块
  • 原文地址:https://www.cnblogs.com/runliuv/p/3489427.html
Copyright © 2011-2022 走看看