您的位置:首页 > 编程语言

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

2013-11-09 16:44 441 查看
用到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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: