回答

0

如果您的WebBrowser爲基礎的應用程序和您的網頁仍然可以正常使用IE10,以下可能是問題的原因。

在一個頗具爭議的決定中,Microsoft has changed the traditional layout of IE User Agent (UA) string in IE11

這是UI字符串的樣子在IE11:

 
navigator.userAgent: Mozilla/5.0 (Windows NT 6.2; WOW64; Trident/7.0; rv:11.0) like Gecko 
document.documentMode: 11 
document.compatMode: CSS1Compat 

這是它曾經的樣子在IE10和舊版本:

 
navigator.userAgent: Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0;) 
document.documentMode: 10 
document.compatMode: CSS1Compat 

雖然精心設計的網頁不應該依賴UA字符串來檢測可用的HTML功能,現有的很多頁面仍然可以使用,而這種更改可能會讓他們感到困惑。

如果你有在網頁加載沒有控制,而無法修復,以恢復傳統的UA字符串的方法之一是強制IE7仿真與FEATURE_BROWSER_EMULATIONWebBrowser基於應用程序。不幸的是,你不得不像IE7一樣低。指定更高版本不會恢復舊的UA字符串佈局。

另一個更靈活但更復雜的解決方法是通過WinAPI設置一個自定義的UA字符串通過UrlMkSetSessionOption/URLMON_OPTION_USERAGENT WinAPI。您應該使用UrlMkGetSessionOption檢索當前UI字符串,解析它,添加缺少的部分並將其設置回UrlMkSetSessionOption。在WebBrowser對象被實例化之前,在Form類的static構造函數中執行此操作。

[UPDATE]用於改變用戶代理字符串的代碼:

static public void ChangeUserAgentForIE11() 
{ 
    if (GetIEVersion() <= 10) 
     return; 

    var userAgent = new StringBuilder(256); 
    int length = 0; 
    Win32.UrlMkGetSessionOption(Win32.URLMON_OPTION_USERAGENT, userAgent, userAgent.Capacity-1, ref length, 0); 

    // IE10: navigator.userAgent: Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0; .NET4.0E; .NET4.0C; .NET CLR 3.5.30729; .NET CLR 2.0.50727; .NET CLR 3.0.30729; Media Center PC 6.0; Tablet PC 2.0) 
    // IE11: navigator.userAgent: Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; .NET4.0E; .NET4.0C; Media Center PC 6.0; .NET CLR 3.5.30729; .NET CLR 2.0.50727; .NET CLR 3.0.30729; rv:11.0) like Gecko 

    var regex = new Regex(@"^\s*(Mozilla/\d+\.\d+\s+\()(Windows\s+.*)like Gecko\s*$", RegexOptions.IgnoreCase); //IE11 regex 
    var match = regex.Match(userAgent.ToString()); 
    if (match.Success) 
    { 
     var newUserAgent = String.Concat(match.Groups[1], "compatible; MSIE 10.0; ", match.Groups[2]); 
     Win32.UrlMkSetSessionOption(Win32.URLMON_OPTION_USERAGENT, newUserAgent, newUserAgent.Length, 0); 
     var verifyUserAgent = new StringBuilder(256); 
     length = 0; 
     Win32.UrlMkGetSessionOption(Win32.URLMON_OPTION_USERAGENT, verifyUserAgent, verifyUserAgent.Capacity-1, ref length, 0); 
     if (verifyUserAgent.ToString() != newUserAgent) 
      throw new ApplicationException("Unable to change WebBrowser User Agent."); 
    } 
} 
+0

謝謝,但修復程序不工作。如何在.NET中輕鬆設置UrlMkSetSessionOption? – majco333

+0

@ majco333,不確定你的意思是「hotfix」。我已經發布了相關代碼,將'GetIEVersion'和'Win32' p/invoke定義保留爲練習。 – Noseratio

+0

我必須導入到Win32函數的.net項目中。因爲我沒有看到我的項目。謝謝 – majco333