【问题标题】:How do I open links from a TCppWebBrowser component in the systems default browser如何在系统默认浏览器中打开来自 TCppWebBrowser 组件的链接
【发布时间】:2009-10-13 07:53:41
【问题描述】:

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

【问题讨论】:

  • 您的想法是优雅的解决方案。你想替换默认操作,有一个回调,所以使用它是合乎逻辑的。
  • Qwark,你说你“希望......一个你可以处理的事件”?你认为 OnBeforeNavigate2 是什么?
  • Rob:我确实编辑了我的问题,所以它没有任何意义,我现在明白了 =P

标签: c++ delphi browser twebbrowser


【解决方案1】:

假设 TCppWebBrowser 就像 Delphi 中的 TWebBrowser,下面的代码应该可以帮助您。

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

为了使下面的代码正常工作,请双击您的表单,然后输入 FormCreate 事件方法内容。 然后放下一个 TWebBrowser,进入对象检查器的事件页面并双击 OnBeforeNavigate2 事件并输入该代码。

玩得开心!

--杰罗恩

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.

【讨论】:

    【解决方案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"'."); } } }

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

    代码也是为 C++Builder 2009 / 2010 编写的,因为它使用了UnicodeStringL 字符串前缀。你没有说你使用的是什么版本,但如果你使用的是 2007 或之前的版本,请改为 WideString

    干杯,

    大卫

    【讨论】:

    • 谢谢!我的 C++ 有点生疏,因此我给出了 Delphi 示例 :-)
    • 谢谢。我在 c++ builder 中编程,但阅读 Delphi 没有问题,所以 Mr Pluimers 解决方案很好。这就是我所做的。
    【解决方案3】:

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

    更多TCppWebBrowser的代码,看我找到的这个链接: http://codeback.net/tag/tcppwebbrowser

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-21
      • 2012-07-18
      • 1970-01-01
      • 2015-03-11
      • 2012-08-11
      • 2014-08-11
      • 1970-01-01
      相关资源
      最近更新 更多