修改注册表对应键值,然后广播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消息也成功修改了,代码如上。