2010-05-20 119 views
3

我試圖捕獲代理設置(「自動檢測設置」)。我的代碼適用於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上,上述代碼也無法捕獲「自動檢測設置」選項。對此的任何輸入都非常感謝。

感謝 約翰

回答

7

這是IE8引入了新的性能優化功能,稱爲SmartWPAD。

WinINET會跟蹤給定的網絡是否具有WPAD服務器(例如,使用自動檢測功能來查找)。如果網絡沒有WPAD服務器,那麼當您執行InternetQueryOption時,WinINET會有效地「掩蓋」「使用自動檢測」位,以便您的代碼不會浪費大量時間進行代理查找,該代理將不會返回代理這個網絡。

如果您必須獲取UI狀態(擊敗WinINET SWPAD功能),例如,因爲您計劃採用此信息並將其緩存以供其他網絡或類似用途使用,則必須首先查詢INTERNET_PER_CONN_FLAGS_UI - 使用此選項時,您將取回UI狀態,而不受SWPAD功能的影響。

如果此查詢失敗,那麼系統正在運行先前版本的Internet Explorer,並且客戶端應使用INTERNET_PER_CONN_FLAGS再次查詢。

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; 
    }