3

我正在尝试捕获代理设置(“自动检测设置”)。我的代码适用于 XP 和 Vista。但它不适用于 Windows 7

请查看目标平台的详细信息

Windows 7 企业版,IE 8.0.7600.16385,Wininet.dll 8.0.7600.16535

请看代码片段

INTERNET_PER_CONN_OPTION_LIST List;
INTERNET_PER_CONN_OPTION Option[1];

unsigned long nSize = sizeof(INTERNET_PER_CONN_OPTION_LIST);
Option[0].dwOption = INTERNET_PER_CONN_FLAGS;
List.dwSize = sizeof(INTERNET_PER_CONN_OPTION_LIST);
List.pszConnection = NULL;
List.dwOptionCount = 1;
List.dwOptionError = 0;
List.pOptions = Option;

if(!InternetQueryOption(NULL, INTERNET_OPTION_PER_CONNECTION_OPTION, &List, &nSize))
    AfxMessageBox(L"InternetQueryOption failed! (%d)\n");

TCHAR a[100];
swprintf(a, L"Flag value is : %d",Option[0].Value.dwValue, 80); 
AfxMessageBox(a);

但是在 Windows 7 上,即使选中了 IE 中的“自动检测设置”选项,程序也会说没有设置该标志

我也尝试使用 WinHttp api,如下所示。

WINHTTP_CURRENT_USER_IE_PROXY_CONFIG stProxyConfig = {0};

WinHttpGetIEProxyConfigForCurrentUser(&stProxyConfig);

if (stProxyConfig.fAutoDetect == TRUE)
    AfxMessageBox(L"Auto proxy detection enabled");
else
    AfxMessageBox(L"Auto proxy detection disabled");

在 Windows 7 上,上述代码也无法捕获“自动检测设置”选项。对此的任何意见都将受到高度赞赏。

谢谢约翰

4

2 回答 2

8

这是 IE8 中引入的一项新的性能优化功能,称为 SmartWPAD。

WinINET 跟踪给定网络是否有 WPAD 服务器(例如,自动检测功能用于查找什么)。如果网络没有 WPAD 服务器,那么当您执行 InternetQueryOption 时,WinINET 会有效地“屏蔽”“使用自动检测”位,这样您的代码就不会浪费大量时间进行代理查找,而不会返回任何代理这个网络。

如果您必须获取 UI 状态(击败 WinINET SWPAD 功能),例如,您计划获取此信息并将其缓存以在其他网络或类似网络上使用,那么您必须首先查询 INTERNET_PER_CONN_FLAGS_UI——当您使用此选项,您将获得独立于 SWPAD 功能的 UI 状态。

如果此查询失败,则系统正在运行以前版本的 Internet Explorer,客户端应使用 INTERNET_PER_CONN_FLAGS 再次查询。

于 2011-02-28T04:36:08.213 回答
1

我有一个 C# 代码片段,您可以在其中选中/取消选中 IE 连接设置的“自动检测设置”复选框。您可以在此代码段中找到您要查找的内容。

    public bool IsIEAutoDetectProxy(bool set)
    {
        // Setting Proxy information for IE Settings.
        RegistryKey RegKey = Registry.CurrentUser.OpenSubKey(@"Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\Connections", true);
        byte[] defConnection = (byte[])RegKey.GetValue("DefaultConnectionSettings");
        if (defConnection[8] == Convert.ToByte(9))
           return true;
        else
           return false;
    } 
于 2011-11-07T06:51:57.663 回答