在手动去系统环境变量页面增加新路径后,确定后会自动刷新系统环境变量,但是当我们的程序通过API修改后,如果不做一些处理,系统还是旧的环境,通过cmd去访问是找不到的。

首先系统环境变量对应注册表是HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment(需要管理器权限),通过RegSetValue 等函数修改后,如向path新增加了微信的路径,此时在CMD中执行WeChat是无效的,必须重启才生效,或者进入以下界面,依次确定后才会生效。

解决办法是使用SendMessageTimeout函数广播一条消息。
SendMessageTimeout使用非常简单:参数如下:

hWnd:接收消息的窗口的句柄。如果为HWND_BROADCAST,则消息会被发送到系统中所有顶层窗口,包括无效或不可见的窗口。
Msg:指定被发送的消息。
wParam:指定附加的信息。
IParam:指定附加的信息。
fuFlags:指定如何发送消息。此参数可为下列值的组合:
SMTO_ABORTIFHUNG:如果接收线程没有响应或挂起,则函数将返回,而无需等待超时时间过去。
SMTO_BLOCK:阻止调用线程处理其他任何请求,直到函数返回为止。
SMTO_NORMAL:在等待函数返回时,不会阻止调用线程处理其他请求。
SMTO_NOTIMEOUTIFNOTHUNG:只要接收线程正在处理消息,该函数就不会强制执行超时期限。
SMTO_ERRORONEXIT:如果在处理消息时接收窗口被破坏或它自己的线程死亡,则该函数应返回0。
uTimeout:超时时间,当最多15秒的时间.
lpdwResult消息处理的结果。

根据上面参数,首先hWnd要设置为HWND_BROADCAST,Msg为WM_SETTINGCHANGE,MSDN对WM_SETTINGCHANGE的解释是,更改系统或用户的环境变量,要将lParam设置为字符串"Environment",wParam可以为0,详细可以查看https://docs.microsoft.com/en-us/windows/win32/winmsg/wm-settingchange页面。

[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
public static extern long SendMessageTimeout(IntPtr windowHandle, uint Msg,IntPtr wParam, string lParam, uint flags, uint timeout, out long result);public static void RefreshEnvironment() {long result;SendMessageTimeout(new IntPtr(HWND_BROADCAST), WM_SETTINGCHANGE, IntPtr.Zero,"Environment", SMTO_ABORTIFHUNG, 5000, out result);
}

应用程序修改系统环境变量后如何刷新?相关推荐

  1. JDK的安装与系统环境变量的配置

    一.下载JDK 用户进入到Java SE的下载网页后,根据自己所用的操作系统(Windows.Linux)和位数(32位.64位)选择不同的链接进行下载.本例是在Windows系统的32位机器上开发的 ...

  2. ubuntu系统php环境变量设置,Ubuntu系统环境变量详解

    使用Ubuntu 进行开发绕不开的就是环境变量的配置,由于Linux系统严格的权限管理,造成Ubuntu系统有多个环境变量配置文件,如果不了解其调用顺序,很有可能遇到配置了环境变量,而没有其作用的问题 ...

  3. Java开发环境变量配置【java1.8安装及环境变量详细配置】【JAVA_HOME系统变量、CLASSPATH系统变量、系统环境变量Path】

    jdk1.8.0_201--百度网盘下载:[链接:https://pan.baidu.com/s/1osRsn8D2iMdq_qton0LXrw 提取码:zjxs] 目   录 jdk安装步骤截图 复 ...

  4. [Ubuntu] Ubuntu系统环境变量详解

    使用Ubuntu 进行开发绕不开的就是环境变量的配置,由于Linux系统严格的权限管理,造成Ubuntu系统有多个环境变量配置文件,如果不了解其调用顺序,很有可能遇到配置了环境变量,而没有其作用的问题 ...

  5. C++:getenv setenv -- 获取设置系统环境变量

    C++:getenv & setenv -- 获取&设置系统环境变量 1. getenv:取得环境变量内容 头文件- #include<stdlib.h> 格式: char ...

  6. windows 全局变量_如何在Windows中使用全局系统环境变量

    windows 全局变量 Any system administrator who spends a good bit of time in the command prompt or batch s ...

  7. oracle系统库名,Oracle 札记之 一:数据库名,数据库实例名,数据库域名,操作系统环境变量...

    数据库名是用于区分数据库的一个内部标识,是以二进制方式存储在数据库控制文件中的参数.数据库创建之后不能再修改这个参数.数据库创建后,它被写入数据库参数文件pfile或Spfile中.格式如下: ... ...

  8. Windos下用setx.exe命令行模式下永久设置系统环境变量

    From: http://www.cnblogs.com/soli/archive/2007/08/30/876283.html setx.exe不是系统默认自带的命令,但可以从微软的网站(2K,XP ...

  9. 安装包卸载时如何删除安装时写在系统环境变量中的内容

    在用InstallShield制作安装包时,有时我们会在脚本中通过操作注册表,配置系统环境变量,比如在Path中追加,但卸载时如何清除追加的路径变量,一直有些模糊. 今天受网友启发,在InstallS ...

最新文章

  1. pandas使用bdate_range函数获取起始时间(start)和结束时间(end)范围内的所有工作日日期(business day)
  2. 前端基础知识 - 收藏集 - 掘金
  3. Microsoft Visual C++ 14.0 is required解决方法
  4. 天猫php采集列表,QueryList: QueryList是一个基于phpQuery的通用列表采集类,是一个简单、 灵活、强大的采集工具,采集任何复杂的页面 基本上就一句话就能搞定了。...
  5. C# 字符串大小写混合转换(同时进行)
  6. uwsgi基础——最佳实践和问题
  7. virtualbox ubuntu安装图解
  8. js操作cookie的函数
  9. kotlin学习之伴生对象(十五)
  10. 33行代码AC——例题6-5 移动盒子(Boxes in a Line, UVa 12657)——解题报告
  11. select获取下拉框的值 下拉框默认选中
  12. 深度学习10-tf.data-数据输入管道简介
  13. 实高斯随机向量与复高斯随机向量
  14. Chrome扩展之书签
  15. 速存,懒人福音!联想修复工具大全 Lenovo Quick Fix 联想智能解决工具
  16. 用Python统计字符串个数
  17. css3 微信聊天小尖角,用CSS制作聊天框小尖角、气泡效果
  18. 个税计算公式excel_我月薪1万,为啥个税只交150块捏?
  19. java代码桥梁收费站_高速公路收费站演讲稿(精简版).doc
  20. 前端---HTML制作百度首页

热门文章

  1. PHP连接ACCESS(MDB)数据库的时候中文乱码问题的解决方案
  2. ASP.NET Core 中如何通过 AuthorizeAttribute 做自定义验证?
  3. Eviews用向量自回归模型VAR实证分析公路交通通车里程与经济发展GDP协整关系时间序列数据和脉冲响应可视化...
  4. 更换计算机电源线,由更换电源引发的一次理线记录
  5. php intval 四舍五入,php四舍五入 floor、ceil、round与intval
  6. C#使用SqlConnection的事务SqlTransaction
  7. require的使用
  8. 互联网+云养殖数字技术带给传统养殖业、传统农业的新机遇
  9. 一金创投安全放心怎样买理财产品挣钱?(买理财产品挣钱诀窍)
  10. 花卉店家端隐私权政策