我们在程序中使用TCppWebBrowser组件作为一种聊天窗口,但是由于TCppwebrowser使用的是IExplorerengine,因此所有单击的链接都在IExplorer中打开。
我的一个主意是取消Onbeforenavigate2中的导航并执行Shell.execute,但是希望有一个更优雅的解决方案,例如我可以处理的windowsmessage或事件等。

最佳答案

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

在TWebBrowser导航到新URL之前,将触发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.

关于c++ - 如何在系统默认浏览器中打开来自TCppWebBrowser组件的链接,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1558768/

10-10 21:26