在默认浏览器中打开 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 地址