c# .net 編程方式修改環境變量無效的解決辦法


無論是修改注冊表方式(System\ControlSet001\Control\Session Manager\Environment"),還是用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的小工具,可鬧騰了些天。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM