如何在系统默认浏览器中打开TCppWebBrowser组件的链接

时间:2009-10-13 07:53:42

标签: c++ delphi browser twebbrowser

我们在程序中使用TCppWebBrowser组件作为一种聊天窗口,但由于TCppwebrowser正在使用IExplorerengine,所有点击的链接都在IExplorer中打开。 我有一个想法是取消Onbeforenavigate2中的导航和一个Shell.execute,但希望有一个更优雅的解决方案,比如我可以处理的windowsmessage或事件或什么。

3 个答案:

答案 0 :(得分:7)

假设TCppWebBrowser与Delphi中的TWebBrowser类似,下面的代码应该可以帮助你。

在TWebBrowser导航到新网址之前,OnBeforeNavigate2 event会被触发。 您所做的是取消该导航,并redirect the URL with ShellExecute to an external application(这是Windows中配置的默认Web浏览器)。

要使下面的代码生效,请双击您的表单,然后输入FormCreate事件方法内容。 然后删除一个TWebBrowser,进入对象检查器的事件页面,然后双击OnBeforeNavigate2事件并输入该代码。

玩得开心!

- 的Jeroen

unit MainFormUnit;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, OleCtrls, SHDocVw;

type
  TForm1 = class(TForm)
    WebBrowser1: TWebBrowser;
    procedure FormCreate(Sender: TObject);
    procedure WebBrowser1BeforeNavigate2(ASender: TObject; const pDisp: IDispatch;
        var URL, Flags, TargetFrameName, PostData, Headers: OLEVariant; var Cancel:
        WordBool);
  private
    RedirectUrls: Boolean;
  end;

var
  Form1: TForm1;

implementation

uses
  ShellAPI;

{$R *.dfm}

procedure TForm1.Create(Sender: TObject);
begin
  WebBrowser1.Navigate('http://www.stackoverflow.com');
  RedirectUrls := True;
end;

procedure TForm1.WebBrowser1BeforeNavigate2(ASender: TObject; const pDisp:
    IDispatch; var URL, Flags, TargetFrameName, PostData, Headers: OLEVariant;
    var Cancel: WordBool);
var
  UrlString: string;
begin
  if not RedirectUrls then
    Exit;
  UrlString := URL;
  ShellExecute(Self.WindowHandle, 'open', PChar(UrlString), nil, nil, SW_SHOWNORMAL);
  Cancel := True;
end;

end.

答案 1 :(得分:2)

Jeroen给出的示例是正确的,除了它不是C ++,我认为您可能会找到您正在使用的语言示例。 TCppWebBrowser组件类似于TWebBrowser组件并具有相同的事件。 (但是当你试图访问一些内部时,它会变得更复杂。)

这是我使用的OnBeforeNavigate2方法的编辑版本:

void __fastcall TMyForm::CppWebBrowserBeforeNavigate2(TObject* /*Sender*/,
        LPDISPATCH /*pDisp*/, Variant* URL, Variant* /*Flags*/, Variant* /*TargetFrameName*/,
        Variant* /*PostData*/, Variant* /*Headers*/, VARIANT_BOOL *Cancel)
{
    UnicodeString strURL(URL->operator UnicodeString());
    if (strURL != m_strWebPage && strURL != L"about:blank") { // if navigating somewhere else, ie the user clicked a link
        *Cancel = true;
        if ((int)::ShellExecute(NULL, L"open", strURL.c_str(), NULL, NULL, SW_SHOWNORMAL) <= 32) {
            MyMessageBox(L"There was an error opening the link '" + strURL + L"'.");
        }
    }
}

它取消了在网络浏览器中的导航,除了about:blank(如果它不是您的控件的合法页面,您可以删除该位)和我希望它锁定的网址m_strWebPage至。您可以使此检查更加灵活,例如,允许它在某个域上的任何位置导航,但在另一个窗口中打开指向另一个域的链接,例如。

该代码也是为C ++ Builder 2009/2010编写的,因为它使用了UnicodeStringL字符串前缀。您没有说明您正在使用的是哪个版本,但是如果您使用的是2007或者之前转换为WideString

干杯,

大卫

答案 2 :(得分:0)

事实上,当您没有处理TCppWebBrowser的“webNewWindow2”时,您打开的TCppWebBrowser中的链接将被用作系统默认浏览器。你无需做任何事情。

有关TCppWebBrowser的更多代码,请参阅此链接,我发现: http://codeback.net/tag/tcppwebbrowser