更改 IE 代理服务器的设置
可以通过 ie 浏览器的主界面的菜单设置, “工具 -> Internet 选项 -> 连接 -> 局域网设置” 的 “代理服务器” 选项设置.

在 windows 下可以通过直接改以下注册表的方式更改代理设置, 但 IE 进程必须重启, 不是很专业.
Regedit4 [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings] "MigrateProxy"=dword:00000001 "ProxyEnable"=dword:00000001 "ProxyHttp1.1"=dword:00000000 "ProxyServer"="http://ProxyServername:80" "ProxyOverride"="<local>"
更好的方法是采用 InternetSetOption 函数实时改设置, 并马上对系统全局所有进程生效.
#include <wininet.h>
#pragma comment(lib, "wininet")
typedef struct PROXY_SETTINGS_DATA
{
DWORD nFlags;
TCHAR szProxy[MAX_PATH];
} PROXY_SETTINGS_DATA;
void _GetProxyInfo(PROXY_SETTINGS_DATA * pSettings)
{
INTERNET_PER_CONN_OPTION_LIST List = { 0 };
INTERNET_PER_CONN_OPTION Option[5] = { 0 };
unsigned long nSize = sizeof(INTERNET_PER_CONN_OPTION_LIST);
Option[0].dwOption = INTERNET_PER_CONN_AUTOCONFIG_URL;
Option[1].dwOption = INTERNET_PER_CONN_AUTODISCOVERY_FLAGS;
Option[2].dwOption = INTERNET_PER_CONN_FLAGS;
Option[3].dwOption = INTERNET_PER_CONN_PROXY_BYPASS;
Option[4].dwOption = INTERNET_PER_CONN_PROXY_SERVER;
List.dwSize = sizeof(INTERNET_PER_CONN_OPTION_LIST);
List.pszConnection = NULL;
List.dwOptionCount = 5;
List.dwOptionError = 0;
List.pOptions = Option;
if(!InternetQueryOption(NULL, INTERNET_OPTION_PER_CONNECTION_OPTION, &List, &nSize))
printf("InternetQueryOption failed! (%d)\n", GetLastError());
if(Option[0].Value.pszValue != NULL)
printf("%s\n", Option[0].Value.pszValue);
if((Option[2].Value.dwValue & PROXY_TYPE_AUTO_PROXY_URL) == PROXY_TYPE_AUTO_PROXY_URL)
printf("PROXY_TYPE_AUTO_PROXY_URL\n");
if((Option[2].Value.dwValue & PROXY_TYPE_AUTO_DETECT) == PROXY_TYPE_AUTO_DETECT)
printf("PROXY_TYPE_AUTO_DETECT\n");
INTERNET_VERSION_INFO Version = { 0 };
nSize = sizeof(INTERNET_VERSION_INFO);
InternetQueryOption(NULL, INTERNET_OPTION_VERSION, &Version, &nSize);
pSettings->nFlags = Option[2].Value.dwValue;
lstrcpyn(pSettings->szProxy, Option[4].Value.pszValue, MAX_PATH);
if(Option[0].Value.pszValue != NULL)
GlobalFree(Option[0].Value.pszValue);
if(Option[3].Value.pszValue != NULL)
GlobalFree(Option[3].Value.pszValue);
if(Option[4].Value.pszValue != NULL)
GlobalFree(Option[4].Value.pszValue);
}
int _SetProxyInfo(PROXY_SETTINGS_DATA * pSettings)
{
// To include server for FTP, HTTPS, and so on, use the string
// (ftp=http://<ProxyServerName>:80; https=https://<ProxyServerName>:80)
INTERNET_PER_CONN_OPTION_LIST List;
INTERNET_PER_CONN_OPTION Option[3];
unsigned long nSize = sizeof(INTERNET_PER_CONN_OPTION_LIST);
Option[0].dwOption = INTERNET_PER_CONN_PROXY_SERVER;
Option[0].Value.pszValue = pSettings->szProxy;
Option[1].dwOption = INTERNET_PER_CONN_FLAGS;
Option[1].Value.dwValue = pSettings->nFlags;
// This option sets all the possible connection types for the client.
// This case specifies that the proxy can be used or direct connection is possible.
Option[2].dwOption = INTERNET_PER_CONN_PROXY_BYPASS;
Option[2].Value.pszValue = "<local>";
List.dwSize = sizeof(INTERNET_PER_CONN_OPTION_LIST);
List.pszConnection = NULL;
List.dwOptionCount = 3;
List.dwOptionError = 0;
List.pOptions = Option;
if(!InternetSetOption(NULL, INTERNET_OPTION_PER_CONNECTION_OPTION, &List, nSize))
printf("InternetSetOption failed! (%d)\n", GetLastError());
InternetSetOption(NULL, INTERNET_OPTION_REFRESH, NULL,NULL);
//The connection settings for other instances of Internet Explorer.
return 0;
}
使用时, 先调用 _GetProxyInfo 函数将原始的设置取出, 保存起来; 再用 _SetProxyInfo 设置新的代理参数; 当不用自己的代理时, 将旧的设置参数写回去.
PROXY_SETTINGS_DATA stOrigin = { 0 };
PROXY_SETTINGS_DATA stNew = {
PROXY_TYPE_PROXY | PROXY_TYPE_DIRECT,
_T("http://ProxyServername:80"),
};
_GetProxyInfo(&stOrigin);
_SetProxyInfo(&stNew);
// ...
// other code
// ...
_SetProxyInfo(&stOrigin);

近期评论