MFC修改环境变量

修改注册表对应键值,然后广播WM_SETTINGCHANGE消息,可以修改用户和系统环境变量并不用重启系统就可立即生效。

当前用户环境变量:"HKEY_CURRENT_USER/Environment" 键下的各参数。
系统环境变量:"HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment"键下的各参数。
涉及到的API函数有:RegOpenKeyEx, RegQueryValueEx, RegSetValueEx; 相关函数的用法可以参考MSDN.
如果控制台是在修改前就打开的,除非关闭后重新开启,不然是无法得到新设置的环境变量的。
通过这几个函数修改环境变量后, 使用了PostMessage(HWND_BROADCAST, WM_SETTINGCHANGE , NULL, NULL),但结果环境变量

并没有生效。再使用SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE , NULL, 

(LPARAM)"Environment",SMTO_NORMAL, 1000, &dwResult),最后使用SendMessageTimeout(HWND_BROADCAST,

WM_SETTINGCHANGE , NULL, (LPARAM)"Environment", SMTO_NOTIMEOUTIFNOTHUNG,1000, &dwResult)成功。


#include <afx.h>

#include<stdio.h>
#include<stdlib.h>
#include<Windows.h>
#include<string.h>
#include <winreg.h>


int main()
{
//  char *p;
//  if((p = getenv("USER")))
//  printf("USER =%s\n", p);
//  putenv("USER=test");
//  printf("USER=%s\n", getenv("USER"));



CString strNetInstallPath;
HKEY hKey;
//TCHAR  data[MAX_PATH];
LPBYTE  data[MAX_PATH];
memset(data,0,MAX_PATH);
DWORD dwType = REG_SZ;
DWORD lValueSize;
int iValueSize = 5;


CString strVale("Root");
LPTSTR username_Set= strVale.GetBuffer(strVale.GetLength());
//用户环境变量
//CString strRegPath =_T("Environment");
//if(RegOpenKey(HKEY_CURRENT_USER, strRegPath, &hKey) != ERROR_SUCCESS) 


//系统环境变量
CString strRegPath = _T("System\\CurrentControlSet\\Control\\Session Manager\\Environment");
if(RegOpenKey(HKEY_LOCAL_MACHINE, strRegPath, &hKey) != ERROR_SUCCESS) 
{
//AfxMessageBox(_T("读取注册表失败"));
return 0;

else

if (RegQueryValueEx(hKey,_T("USER"),NULL,&dwType,(LPBYTE)data,&lValueSize) == ERROR_SUCCESS)
{
strNetInstallPath.Format(_T("%s"),data);

else
{
dwType = REG_SZ; //需重置
if (RegSetValueEx(hKey,_T("USER"),NULL,dwType,(LPBYTE)username_Set,(DWORD)iValueSize) != ERROR_SUCCESS)
{
return 0;
}
}
RegCloseKey(hKey); 
}
return 0;

}


我没有广播WM_SETTINGCHANGE消息也成功修改了,代码如上。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值