【问题标题】:Unable to remove the borders and scrollbars of a TWebBrowser?无法删除 TWebBrowser 的边框和滚动条?
【发布时间】:2014-10-22 11:37:49
【问题描述】:

我正在尝试从 TWebBrowser 中删除滚动条和边框。我发现了大量对以下代码的引用,并且在 www.google.com 上使用时效果很好:

// Switch off scrollbars
WB.OleObject.document.body.style.overflowX := 'hidden';
WB.OleObject.document.body.style.overflowY := 'hidden';

// Switch off borders
WB.OleObject.document.body.style.borderstyle := 'none';

但是,使用 ASP.NET 生成的网页,它不再起作用。

这是 ASP.NET aspx 代码:

<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Test</title>
</head>
<body bgcolor="#333333" border="0">
    <form id="form1" runat="server">
    <table style="width:100%;">
        <tr>
            <td class="style7">
                <asp:Label ID="Label2" runat="server" Font-Names="Arial" Font-Size="21pt" 
                    ForeColor="#F2F2F2" Text="Test"></asp:Label>
            </td>
        </tr>
    </table>
    </form>
</body>
</html>

...这是由 ASP.NET 应用程序生成的 HTML:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head><title>
    Test
</title></head>
<body bgcolor="#333333" border="0">
    <form method="post" action="Default.aspx" id="form1">
<div class="aspNetHidden">
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUJODExMDE5NzY5ZGSKCPuFcF0SPBHrn5HUkzHPVjgZoCXwtqbgbPjoAyOPAQ==" />
</div>

    <table style="width:100%;">
        <tr>
            <td class="style7">
                <span id="Label2" style="color:#F2F2F2;font-family:Arial;font-size:21pt;">Test</span>
            </td>
        </tr>
    </table>
    </form>
</body>
</html>

知道为什么滚动条/边框仍然可见吗?

【问题讨论】:

  • 您能发布您的 DFM 的文本吗?没有任何代码,如果我将页面加载到 350 高 x 500 宽的 WebBrowser 中,Aligh = alNone,我没有水平滚动条,只有一个没有拇指的垂直滚动条,而使用 Align = alTop,我没有得到任何滚动条。
  • 你在什么IE模式下运行TWebbrowser(即FEATURE_BROWSER_EMULATION)?
  • @MartynA - 我现在在家,所以无法发布代码,但在我的测试应用程序中它非常简单。只是一个 TWebBrowser 放在一个带有 2 个按钮的表单上(没有对齐设置,所有属性都保留为默认值)。一个按钮导航到 URL,另一个按钮尝试删除滚动条和边框。
  • @whosrdaddy - 我不确定 IE 正在运行什么模式,但我没有更改任何内容,所以它必须是默认模式。
  • 所以这基本上意味着您的页面默认在 IE7 兼容模式下运行。尝试添加链接文章中所述的注册表项,看看是否可以解决您的问题...

标签: asp.net delphi internet-explorer-11 twebbrowser delphi-xe6


【解决方案1】:

专注于浏览器仿真

正如您之前所说的那样,并且您已经添加了标签internet-explorer-11,我认为问题或多或少与页面呈现策略有关。所以解决方案可能是FEATURE_BROWSER_EMULATION。您能否确认问题仅发生在 MSIE11 上?

如果是FEATURE_BROWSER_EMULATION,您应该在注册表中添加一个条目,其中应用程序名称作为键。该值应该是相应的仿真标志。为了更好的排查问题,请粘贴相关代码。

这是我经过验证的代码,可以更改您的应用程序的呈现策略。你可以试一试。

const
  BROWSER_EMULATION_MSIE11_FORCED = 11001;
  BROWSER_EMULATION_MSIE11 = 11000; // currently this is the best rendering engine we can have
  BROWSER_EMULATION_MSIE10_FORCED = 10001;
  BROWSER_EMULATION_MSIE10 = 10000;
  BROWSER_EMULATION_MSIE9_FORCED = 9999;
  BROWSER_EMULATION_MSIE9 = 9000;
  BROWSER_EMULATION_MSIE8_FORCED = 8888;
  BROWSER_EMULATION_MSIE8 = 8000;
  BROWSER_EMULATION_MSIE7 = 7000;

procedure SetBrowserEmulation(Value: Integer; const ExeName: string);
begin
  ChangeFeatureControlRegValue('FEATURE_BROWSER_EMULATION', ExeName, Value);
end;

procedure ChangeFeatureControlRegValue(const Feature, ExeName: string; Value: Integer);
var
  Reg: TRegistry;
begin
  Reg := TRegistry.Create;
  try
     if Reg.OpenKey('\Software\Microsoft\Internet Explorer\Main\FeatureControl\' + Feature, {CanCreate=}True) then
     begin
       try
         Reg.WriteInteger(ExeName, Emulation);
       finally
         Reg.CloseKey;
       end;
     end;
  finally
    Reg.Free;
  end;
end;

作为一个小推广,你可以使用我的dutil.sys.win32.registry.Writer 来简化整个注册表访问的东西。

procedure ChangeFeatureControlRegValue(const Feature, ExeName: string; Value: Integer);
begin
  TWriter.WriteUInt('\Software\Microsoft\Internet Explorer\Main\FeatureControl\' + Feature, ExeName, Value);
end;

另一种方法

另一种方法是覆盖浏览器行为。你有没有试过实现IDocHostUIHandleroverride IDocHostUIHandler::GetHostInfo。如果你尝试过著名的TEmbeddedWB 组件,你会发现如何实现IDocHostUIHandler 的演示代码。关键是设置pInfo.dwFlags 包含标志DOCHOSTUIFLAG_SCROLL_NO

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-12
    • 1970-01-01
    • 2016-08-09
    • 1970-01-01
    • 1970-01-01
    • 2020-02-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多