在默认浏览器中打开 TWebBrowser 链接

Posted

技术标签:

【中文标题】在默认浏览器中打开 TWebBrowser 链接【英文标题】:Opening TWebBrowser link in default browser 【发布时间】:2012-07-18 09:46:57 【问题描述】:

我的应用程序在TWebBrowser 控件中显示一个从网络加载的小横幅。这个横幅实际上是一个包含图像的 html 页面;当用户点击图片时,它会将他们带到我们当前正在运行的促销活动中。

这里的坏处是当点击 TWebBrowser 中的链接时,活动页面是在 Internet Explorer 中打开的,而不是在他们的默认浏览器中。我知道这是因为TWebBrowser 是一个基于 IE 的控件,但是有没有办法在用户选择的浏览器中打开链接?

谢谢。

【问题讨论】:

【参考方案1】:

TWebBrowser 通过自己的 NewWindow2 事件公开 DWebBrowserExents2::NewWindow2

所以处理事件并向事件发送者提供自动化接口

procedure TForm1.WebBrowser1NewWindow2(
    ASender: TObject; var ppDisp: IDispatch; var Cancel: WordBool);

begin  
// create a new browser (e.g. hosted on a new tab /MDI form/ top level window)
// and expose the browser as a property of the new window. 
// Here a form2 object is created to host the new webbrowser instance
...
form2.InitNavigate=False;//the navigation will be triggered after this event
form2.Visible=False;//new window is only for getting the url
ppDisp := form2.WebBrowser1.Application;  
form2.Show;
end;

现在您可以在 form2 上的 BeforeNavigate2 事件处理程序中获取新窗口的 URL。取消该事件,您可以使用 ShellExecute 启动默认浏览器。

如果您只支持 Windows SP SP2 或更高版本,您可以在创建新窗口之前挂钩 NewWindow3 事件,该事件在参数中提供 URL。

【讨论】:

另一个选项是设置Cancel=True,然后使用ShellExecute()TWebBrowser之外的用户默认浏览器中启动URL。 在某些将点击 javascript URI 视为导航事件的 IE 版本中,这不适用于目标为 javascript 的链接。在这种情况下,BeforeNavigate2 中的 url 将是 javascript:function name。 由于您必须知道 URL 才能启动它,因此只需检查 URL 并仅取消您要在外部启动的那些。 我的意思是有时在 BeforeNavigate2 甚至 NewWindow2 中都不知道 URL。如果取消 BeforeNavigate2,您将无法知道 URL 是什么。 BeforeNavigate2 事件告诉您正在导航到的 URL。它是事件的参数。如果您不取消它,它甚至允许您在导航继续之前更改 URL。【参考方案2】:

OnBeforeNavigate2 事件中,检查请求的 URL,如果是您想要启动的 URL,则 Stop() 当前导航并调用 ShellExecute() 以在用户的​​默认外部浏览器中启动 URL。

procedure TForm1.WebBrowser1BeforeNavigate2(Sender: TObject; pDisp: IDispatch; var URL: Variant; var Flags: Variant; var TargetFrameName: Variant; var PostData: Variant; var Headers: Variant; var Cancel: WordBool);
begin  
  if (URL should be launched) then
  begin
    Cancel := True;
    WebBrowser1.Stop;
    ShellExecute(0, nil, PChar(String(Url)), nil, nil, SW_SHOWNORMAL);
  end;
end;

【讨论】:

嘿雷米。我不知道我想要访问的确切 URL,这就是我没有在客户端应用程序中包含代码的原因。我使用横幅来宣布新产品、更新、活动和促销活动。我需要能够更新服务器上的横幅。 如果TWebBrowser 显示您自己的HTML 页面,并且只有图像是页面上的唯一链接,那么您可以取消+启动每个通过OnBeforeNavigate2 事件的URL。如果您需要一些更有针对性的东西,您可以使用OnDocumentComplete 事件来访问 IE 的 DOM 接口,以将 OnClick 事件处理程序直接分配给图像的超链接元素。您的事件处理程序可以获取链接的当前 URL,并在单击链接时使用 ShellExecute() 启动它。 谢谢你,雷米。这就是我一直在寻找的。​​span> 如何实现这个Firemonkey移动应用。? TwebBrowser 没有此事件

以上是关于在默认浏览器中打开 TWebBrowser 链接的主要内容,如果未能解决你的问题,请参考以下文章

从 Delphi 中提取 TWebBrowser 中的 iframe 内容

Delphi TWebBrowser[6] 获取网页所有链接(元素)

在 FireMonkey TWebBrowser 中指定 IP 地址

使用带有 TWebBrowser 的 IHTMLEventObj 处理程序的内存泄漏

WPF WebBrowser - 在默认浏览器中打开链接

MoSync:在默认网络浏览器中打开链接