用到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; }