无法在Windows 7上查询代理“自动检测设置”

问题描述:

我试图捕获代理设置(“自动检测设置”)。我的代码适用于XP和Vista。 但它不是在Windows 7工作无法在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上,上述代码也无法捕获“自动检测设置”选项。对此的任何输入都非常感谢。

感谢 约翰

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

WinINET会跟踪给定的网络是否具有WPAD服务器(例如,使用自动检测功能来查找)。如果网络没有WPAD服务器,那么当您执行InternetQueryOption时,WinINET会有效地“掩盖”“使用自动检测”位,以便您的代码不会浪费大量时间进行代理查找,该代理将不会返回代理这个网络。

如果您必须获取UI状态(击败WinINET SWPAD功能),例如,因为您计划采用此信息并将其缓存以供其他网络或类似用途使用,则必须首先查询INTERNET_PER_CONN_FLAGS_UI - 使用此选项时,您将取回UI状态,而不受SWPAD功能的影响。

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

我有一个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; 
    }