更改 Internet 代理设置






4.64/5 (20投票s)
2003年2月12日

524429
显示以编程方式更改 IE 代理设置的代码片段
引言
更改IE的代理设置是我经常需要做的事情。 最终,我决定自己编写一个工具。 我没有找到关于这方面的清晰说明。 许多文章建议直接修改注册表,但不幸的是,他们的说明不够充分。 大多数都引导我修改注册表中的以下值:-
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings]
"ProxyEnable"=dword:00000001
"ProxyServer"=":"
"ProxyOverride"=""
"DisablePasswordCaching"=dword:00000001
详细说明
我测试了它,发现至少在我的电脑上它不起作用。(我通过ADSL连接访问互联网。) 所以我备份了注册表,并通过Internet Explorer修改了代理设置,发现[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Connections]也被更改了。 因此,我编写了以下代码片段来更改代理设置
void ShowError(long lerr) { LPVOID lpMsgBuf; if (!FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, lerr, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language (LPTSTR) &lpMsgBuf, 0, NULL )) { return; } MessageBox( NULL, (LPCTSTR)lpMsgBuf, "Error", MB_OK | MB_ICONINFORMATION ); LocalFree( lpMsgBuf ); } void CieproxyDlg::OnBnClickedOk() {//set proxy server UpdateData(); GetDlgItemText(IDC_EDIT1,m_sIEProxy); HKEY hk; LONG lret=RegOpenKeyEx(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings", NULL,KEY_WRITE|KEY_SET_VALUE,&hk); if(lret==ERROR_SUCCESS&&NULL!=hk) { TCHAR* pbuf=m_sIEProxy.GetBuffer(1); lret=RegSetValueEx( hk,"ProxyServer",NULL,REG_SZ,pbuf,m_sIEProxy.GetLength()); DWORD dwenable=1; lret=RegSetValueEx(hk,"ProxyEnable",NULL,REG_DWORD, (LPBYTE)&dwenable,sizeof(dwenable)); RegCloseKey(hk); } const TCHAR* keyname3=_T( "software\\Microsoft\\windows\\currentversion\\Internet Settings\\Connections"); lret=RegOpenKeyEx(HKEY_CURRENT_USER,keyname3,NULL, KEY_READ|KEY_WRITE|KEY_SET_VALUE,&hk); if(lret==ERROR_SUCCESS&&NULL!=hk) { DWORD dwtype; char pbuf[256]; DWORD dwlen=sizeof(pbuf); const char* valname="Connection to adsl3"; lret=RegQueryValueEx(hk,valname,NULL,&dwtype,pbuf,&dwlen); if(lret!=ERROR_SUCCESS) { ShowError(lret); } pbuf[8] = 3;//enable proxy pbuf[4]=pbuf[4]+1; const char* p=m_sIEProxy.GetBuffer(1); memcpy(pbuf+16,p,m_sIEProxy.GetLength()); char c=0; for(int i=m_sIEProxy.GetLength();i<20;i++) pbuf[16+i]=c; m_sIEProxy.ReleaseBuffer(); lret=RegSetValueEx(hk,valname,NULL,REG_BINARY,pbuf,dwlen); RegCloseKey(hk); } DWORD dwret; SendMessageTimeout(HWND_BROADCAST,WM_SETTINGCHANGE,NULL,NULL, SMTO_NORMAL,1000,&dwret); } void CieproxyDlg::OnBnClickedDisableProxy() { UpdateData(); GetDlgItemText(IDC_EDIT1,m_sIEProxy); HKEY hk; LONG lret=RegOpenKeyEx(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings", NULL,KEY_WRITE|KEY_SET_VALUE,&hk); if(lret==ERROR_SUCCESS&&NULL!=hk) { DWORD dwenable=0; lret=RegSetValueEx(hk,"ProxyEnable",NULL,REG_DWORD, (LPBYTE)&dwenable,sizeof(dwenable)); RegCloseKey(hk); } const TCHAR* keyname3=_T( "software\\Microsoft\\windows\\currentversion\\Internet Settings\\Connections"); lret=RegOpenKeyEx(HKEY_CURRENT_USER,keyname3, NULL,KEY_READ|KEY_WRITE|KEY_SET_VALUE,&hk); if(lret==ERROR_SUCCESS&&NULL!=hk) { DWORD dwtype; char pbuf[256]; DWORD dwlen=sizeof(pbuf); const char* valname="Connection to adsl3"; lret=RegQueryValueEx(hk,valname,NULL,&dwtype,pbuf,&dwlen); if(lret!=ERROR_SUCCESS) { ShowError(lret); } pbuf[8] = 1;//enable proxy pbuf[4]=pbuf[4]+1; lret=RegSetValueEx(hk,valname,NULL,REG_BINARY,pbuf,dwlen); RegCloseKey(hk); } DWORD dwret; SendMessageTimeout(HWND_BROADCAST,WM_SETTINGCHANGE,NULL,NULL,SMTO_NORMAL, 1000,&dwret); }
上述代码的问题是,现有的Internet Explorer实例不知道设置的更改。 此外,直接修改注册表不是一种优雅的方法。那么以下方法会更具吸引力
BOOL SetConnectionOptions(LPCTSTR conn_name,LPCTSTR proxy_full_addr)
{
    //conn_name: active connection name. 
    //proxy_full_addr : eg "210.78.22.87:8000"
    INTERNET_PER_CONN_OPTION_LIST list;
    BOOL    bReturn;
    DWORD   dwBufSize = sizeof(list);
    // Fill out list struct.
    list.dwSize = sizeof(list);
    // NULL == LAN, otherwise connectoid name.
    list.pszConnection = conn_name;
    // Set three options.
    list.dwOptionCount = 3;
    list.pOptions = new INTERNET_PER_CONN_OPTION[3];
    // Make sure the memory was allocated.
    if(NULL == list.pOptions)
    {
        // Return FALSE if the memory wasn't allocated.
        OutputDebugString("failed to allocat memory in SetConnectionOptions()");
        return FALSE;
    }
    // Set flags.
    list.pOptions[0].dwOption = INTERNET_PER_CONN_FLAGS;
    list.pOptions[0].Value.dwValue = PROXY_TYPE_DIRECT |
        PROXY_TYPE_PROXY;
    // Set proxy name.
    list.pOptions[1].dwOption = INTERNET_PER_CONN_PROXY_SERVER;
    list.pOptions[1].Value.pszValue = proxy_full_addr;//"http://proxy:80";
    // Set proxy override.
    list.pOptions[2].dwOption = INTERNET_PER_CONN_PROXY_BYPASS;
    list.pOptions[2].Value.pszValue = "local";
    // Set the options on the connection.
    bReturn = InternetSetOption(NULL,
        INTERNET_OPTION_PER_CONNECTION_OPTION, &list, dwBufSize);
    // Free the allocated memory.
    delete [] list.pOptions;
    InternetSetOption(NULL, INTERNET_OPTION_SETTINGS_CHANGED, NULL, 0);
    InternetSetOption(NULL, INTERNET_OPTION_REFRESH , NULL, 0);
    return bReturn;
}
BOOL DisableConnectionProxy(LPCTSTR conn_name)
{
    //conn_name: active connection name. 
    INTERNET_PER_CONN_OPTION_LIST list;
    BOOL    bReturn;
    DWORD   dwBufSize = sizeof(list);
    // Fill out list struct.
    list.dwSize = sizeof(list);
    // NULL == LAN, otherwise connectoid name.
    list.pszConnection = conn_name;
    // Set three options.
    list.dwOptionCount = 1;
    list.pOptions = new INTERNET_PER_CONN_OPTION[list.dwOptionCount];
    // Make sure the memory was allocated.
    if(NULL == list.pOptions)
    {
        // Return FALSE if the memory wasn't allocated.
        OutputDebugString("failed to allocat memory in DisableConnectionProxy()");
        return FALSE;
    }
    // Set flags.
    list.pOptions[0].dwOption = INTERNET_PER_CONN_FLAGS;
    list.pOptions[0].Value.dwValue = PROXY_TYPE_DIRECT  ;
    // Set the options on the connection.
    bReturn = InternetSetOption(NULL,
        INTERNET_OPTION_PER_CONNECTION_OPTION, &list, dwBufSize);
    // Free the allocated memory.
    delete [] list.pOptions;
    InternetSetOption(NULL, INTERNET_OPTION_SETTINGS_CHANGED, NULL, 0);
    InternetSetOption(NULL, INTERNET_OPTION_REFRESH , NULL, 0);
    return bReturn;
}
使用方法非常简单明了
//set proxy const char* connection_name="Connection to adsl3"; SetConnectionOptions(connection_name,"62.81.236.23:80"); //disable proxy DisableConnectionProxy(connection_name);
现有的Internet Explorer实例通过INTERNET_OPTION_SETTINGS_CHANGED 和 INTERNET_OPTION_REFRESH 得到通知
