TWebBrowser и FEATURE_BROWSER_EMULATION во время выполнения - PullRequest
3 голосов
/ 30 июня 2011

Кто-нибудь пытался создать и уничтожить TWebBrowser во время выполнения и использовать FEATURE_BROWSER_EMULATION для переключения режима браузера перед повторным созданием TWebBrowser для включения переключения режима без перезапуска приложения?

Мне интересно, читается ли параметр только при запуске приложения или при создании элемента управления веб-браузера.

Ответы [ 2 ]

5 голосов
/ 22 октября 2012

Вам не нужно создавать или уничтожать 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 );
3 голосов
/ 21 июля 2011

Я попробовал, и это не сработало.

Вот что я сделал:

  1. Создал и запустил приложение с существующим TWebBrowser, который загружает веб-страницу на котором отображается текущий пользовательский агент - на нем отображается MSIE 7.0 (установлено 9.0, поэтому включен режим совместимости для встроенных элементов управления)
  2. Пока еще работает, я добавил приложение к HKCU\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION для обеспечения соблюдения использование версии 9 (добавлено 9999 для моего exe-имени)
  3. Все еще работает, я динамически создал TWebBrowser и загружена та же веб-страница, что и на шаге 1, но пользовательский агент все еще показывал MSIE 7.0
  4. После перезапуска приложения пользователь агент был 9.0 с начала

Похоже, вам придется перезапустить приложение.

...