3

実行時に TWebBrowser を作成および破棄し、FEATURE_BROWSER_EMULATION を使用してブラウザ モードを切り替えてから、TWebBrowser を再作成して、アプリケーションを再起動せずにモードを切り替えられるようにしようとした人はいますか?

設定はアプリ起動時のみ読み込むのか、Webブラウザコントロール作成時のみなのか気になります。

4

2 に答える 2

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 );
于 2012-10-21T20:53:34.667 に答える
3

試してみましたが、うまくいきませんでした。

これは私がしたことです:

  1. 現在のユーザー エージェントを表示する Web ページをロードする既存の TWebBrowser を使用してアプリケーションを作成して開始しました - MSIE 7.0 が表示されました (インストールされているのは 9.0 であるため、組み込みコントロールの互換モードが開始されました)。
  2. 実行中にアプリケーションを追加してHKCU\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION、バージョン 9 の使用を強制しました (exe 名に 9999 を追加しました)。
  3. まだ実行中ですが、TWebBrowser を動的に作成し、ステップ 1 と同じ Web ページをロードしましたが、ユーザー エージェントには MSIE 7.0 が表示されました。
  4. アプリケーションを再起動した後、ユーザー エージェントは最初から 9.0 でした

そのため、アプリケーションを再起動する必要があるようです。

于 2011-07-21T15:36:57.527 に答える