首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >运行时的TWebBrowser和FEATURE_BROWSER_EMULATION

运行时的TWebBrowser和FEATURE_BROWSER_EMULATION
EN

Stack Overflow用户
提问于 2011-06-30 20:20:25
回答 2查看 6.7K关注 0票数 3

有没有人尝试过在运行时创建和销毁TWebBrowser,并在重新创建TWebBrowser之前使用FEATURE_BROWSER_EMULATION切换浏览器模式,以便在不重新启动应用程序的情况下切换模式?

我想知道在启动应用程序时,还是在创建web浏览器控件时,设置是只读的。

EN

回答 2

Stack Overflow用户

发布于 2012-10-22 04:53:35

您不需要自己创建或销毁TEmbeddedWB。我这样做(见下文)是为了给应用程序设置正确的IE版本。工作得很完美。您必须在创建表单之前执行此操作。您可以在初始化语句中执行此操作,例如:

代码语言:javascript
复制
 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;

示例使用方法:

代码语言:javascript
复制
initialization
 setEmbeddedWebbrowserMode( iemIE9 );
票数 5
EN

Stack Overflow用户

发布于 2011-07-21 23:36:58

我试过了,但不起作用。

这是我所做的:

  1. 使用现有的TWebBrowser创建并启动了一个应用程序,该应用程序加载了显示当前用户代理的网页-它显示了MSIE 7.0 (安装的版本是9.0,因此嵌入式控件的兼容模式已启动)
  2. 仍在运行时,我将应用程序添加到HKCU\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION以强制使用版本9(为我的可执行文件名称添加了9999 )
  3. 仍在运行我动态创建了一个TWebBrowser并加载了与步骤1中相同的网页-但用户代理在重新启动应用程序后仍显示MSIE 7.0
  4. 用户代理从开头为9.0 H29G210

因此,您似乎必须重新启动应用程序。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6534614

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档