改变IE的代理服务器设置, 并且使之马上生效——编程实例

时间:2021-11-20 17:00:30

用到wininet库里面的InternetSetOption函数. MSDN里面有对它详细的介绍,可以自己去看看.当把参数dwOption设置为INTERNET_OPTION_SETTINGS_CHANGED的时候.他就会促使IE在下一次打开网页的时候重新到注册表里面去取代理的设置信息. 所以我们就可以先将注册表里面的代理信息更改掉,然后调用InternetSetOption函数,从而达到使自己想要的代理设置马上生效的目的.

#pragma comment(lib,"wininet.lib")

#define REGEDIT_INTERNET_SETTINGS "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings"
#define REGEDIT_PROXYSERVER "ProxyServer"
#define REGEDIT_PROXYENABLE "ProxyEnable"

	// get ip
    CEdit *pe_ip = NULL;
    CString cs_ip = _T("");

    pe_ip = (CEdit*)GetDlgItem(IDC_EDIT_IP);
    pe_ip->GetWindowText(cs_ip);

    // get port
    CEdit *pe_port = NULL;
    CString cs_port = _T("");

    pe_port = (CEdit*)GetDlgItem(IDC_EDIT_PORT);
    pe_port->GetWindowText(cs_port);

	//下面的代码将注册表项HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\ProxyServer
	//的内容取出来
	HKEY hKeyIn = HKEY_CURRENT_USER, hKeyOut;
	if(  ERROR_SUCCESS != RegOpenKeyEx( hKeyIn,
		_T( REGEDIT_INTERNET_SETTINGS ),
		0, KEY_CREATE_LINK|KEY_WRITE|KEY_READ|KEY_NOTIFY, &hKeyOut ) )
	{
		return;
	}

	int i_pos = 0, i_pos1 = 0;
	CString cs_oldproxy;
	// get length
	DWORD dw_proxylen = 0;
	int i_ret = RegQueryValueEx( hKeyOut, _T( REGEDIT_PROXYSERVER ), NULL, NULL, NULL, &dw_proxylen );
	if ( ERROR_SUCCESS != i_ret )
	{
		if ( ERROR_FILE_NOT_FOUND != i_ret )
		{
			return;
		}
	}
	else	// exist, get server
	{
		// query value
		DWORD dw_keytype = REG_SZ;

		LPBYTE pValue = new BYTE[dw_proxylen + 2];
		memset( pValue, 0x00, dw_proxylen + 2 );
		if( ERROR_SUCCESS != RegQueryValueEx( hKeyOut, _T( REGEDIT_PROXYSERVER ), NULL, &dw_keytype, pValue, &dw_proxylen ) )
		{
			return;
		}

		cs_oldproxy.Format( _T( "%s" ), pValue );
		delete[] pValue;
		pValue = NULL;

		//从注册表中读出来的数据格式为:http=111.111.111.111:80;ftp=222.222.222.222:21;......,
		//如果你只想改变http的代理的话,就只要把其中的111.111.111.111:80换成你想要的代理就行了,
		//类似的你可以改变其他的代理. 

		//下面的代码就替换http代理成为参数所指定的代理.
		//如果没有字符串中没有找到"http="说明用户没有设置http代理,这时候直接加在最前面.
		if ( -1 == ( i_pos = cs_oldproxy.Find( _T( "http=" ) ) ) )
		{
			i_pos=0;
		}
		if ( -1 == ( i_pos1 = cs_oldproxy.Find( _T( ";" ), i_pos ) ) )
		{
			i_pos1 = cs_oldproxy.GetLength();
		}
	}
	CString cs_just;
	cs_just.Format( _T( "http=%s:%s" ), cs_ip, cs_port ); 
	cs_oldproxy.Delete( i_pos, i_pos1 - i_pos );
	cs_oldproxy.Insert( i_pos, cs_just );

	LPBYTE lpb_proxyserver = ( BYTE* )cs_oldproxy.GetBuffer( cs_oldproxy.GetLength() );
	if( ERROR_SUCCESS != RegSetValueEx( hKeyOut, _T( REGEDIT_PROXYSERVER ), 0, REG_SZ,
		lpb_proxyserver, cs_oldproxy.GetLength() * 2 + 1 ) )
	{
		return;
	} 
	
	// set ProxyEnable = 1
	int  i_tmp = sizeof( DWORD );
	CString cs_proxyenable = _T( "1" );
	LPBYTE lpb_proxyenable = ( BYTE* )cs_proxyenable.GetBuffer( cs_proxyenable.GetLength() );
	if( ERROR_SUCCESS != RegSetValueEx( hKeyOut, _T( REGEDIT_PROXYENABLE ), 0, REG_DWORD,
		lpb_proxyenable, 4 ) )
	{
		return;
	} 

	RegCloseKey( hKeyOut );
	//使设置生效
	if( !InternetSetOption( NULL, INTERNET_OPTION_SETTINGS_CHANGED, NULL, 0 ) )
	{
		return;
	}