2011-06-30 52 views
3

有沒有人試圖在運行時創建和銷燬TWebBrowser,並在重新創建TWebBrowser之前使用FEATURE_BROWSER_EMULATION切換瀏覽器模式,以便在不重新啓動應用程序的情況下切換模式?TWebBrowser和FEATURE_BROWSER_EMULATION在運行時

我想知道設置是否只在啓動應用程序或者當瀏覽器控件被創建時才被讀取。

回答

3

我試過了,它沒有工作。

這是我做過什麼:

  1. 創建並開始與一個負載網頁 ,顯示當前的用戶代理現有TWebBrowser的應用程序 - 它顯示MSIE 7.0(安裝是9.0,所以 兼容模式嵌入式控制踢)
  2. 儘管仍然 運行我添加應用程序HKCU\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION強制 使用的版本9(9999加爲我的exe文件名)
  3. 仍在運行我的動力LY創建 一個TWebBrowser並加載相同的網頁,如步驟1 - 但用戶代理 仍表現MSIE 7.0
  4. 重新啓動應用程序的用戶 劑是從一開始9.0後

所以它看起來像你將不得不重新啓動應用程序。

5

您不需要自己創建或銷燬一個TEmbeddedWB。我做了這個(見下文)爲應用程序設置正確的IE版本。完美地工作。您必須在創建表單之前執行此操作。您可以在初始化語句做到這一點,例如:

TIEMode = (iemUnknown, iemIE7, iemIE8, iemIE9, iemIE10); 
// iemUnknown, don't use this as parameter, return result only 
// iemIE10: To run a WebBrowser control in IE10 Standards Mode 
// iemIE9: To run a WebBrowser control in IE9 Standards Mode 
// iemIE8: To run a WebBrowser control in IE8 Standards Mode 
// iemIE7: To run in IE7 Standards Mode 

function embeddedWebbrowserMode(bSet : Boolean; Mode: TIEMode; AppName: string = '') : LongInt; 
const 
    REG_KEY = 'Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION'; 

var 
    Reg: TRegistry; 
    Value: LongInt; 
    i : LongInt; 

begin 
    Result:=0; 
    if(bSet) and (Mode = iemUnknown) then 
    Exit; 

    if AppName = '' then 
    AppName := ExtractFileName(Application.ExeName); 

    if(bSet) then 
    case Mode of 
    iemIE7 : Value := 7000; 
    iemIE8 : Value := 8888; 
    iemIE9 : Value:=9999; 
    else Value:=10001; // IE10 standards mode 
    end 
    else Value:=0; 

    Reg:=nil; 
    try 
    Reg := TRegistry.Create(); 
    Reg.RootKey := HKEY_CURRENT_USER; 
    if(Reg.OpenKey(REG_KEY, True)) then 
    begin 
     if(bSet) then 
     begin 
     Reg.WriteInteger(AppName, Value); 
     Result:=Value; 
     end 
     else Value:=Reg.ReadInteger(AppName); 
     Reg.CloseKey; 
    end; 
    except; 
    end; 

    if(Assigned(Reg)) then 
    FreeAndNil(Reg); 

    if(NOT bSet) and (Value > 0) then 
    begin 
    i:=Value div 1000; 
    if(i >= 7) and (i <= 10) then 
    begin 
     case i of 
     7000 : Result:=Byte(iemIE7); 
     8888 : Result:=Byte(iemIE8); 
     9999 : Result:=Byte(iemIE9); 
     10001 : Result:=Byte(iemIE10); 
      else begin 
       if(i >=10) then 
       Result:=Byte(iemIE10); 
       end; 
     end; 
    end; 
    end; 
end; 

function setEmbeddedWebbrowserMode(Mode: TIEMode; AppName: string = '') : boolean; 
begin 
Result:=(embeddedWebbrowserMode(TRUE, Mode, AppName) > 0); 
end; 

function getEmbeddedWebbrowserMode(AppName: string = '') : TIEMode; 
begin 
Result:= TIEMode(Byte(embeddedWebbrowserMode(FALSE, iemUnknown, AppName))); 
end; 

示例如何使用它:

initialization 
setEmbeddedWebbrowserMode(iemIE9); 
+0

如果將模式設置爲IE 10的機器上會發生什麼事,只有具有較低版本Internet Explorer安裝? –

+0

我認爲(未測試)它會切換回最新的最新安裝版本和默認模式。所以,如果你有ie9它選擇ie9,但是當你有ie8它將是ie8。 – Codebeat