我们在我们的程序中使用 TCppWebBrowser 组件作为一种聊天窗口,但是由于 TCppwebrowser 使用 IExplorerengine,所有被点击的链接都在 IExplorer 中打开。我的一个想法是取消 Onbeforenavigate2 中的导航并执行 Shell.execute,但希望有一个更优雅的解决方案,例如我可以处理的 windowsmessage 或事件或其他东西。
3 回答
假设 TCppWebBrowser 就像 Delphi 中的 TWebBrowser,下面的代码应该可以帮助你。
OnBeforeNavigate2 事件在TWebBrowser 导航到新 URL 之前被触发。您所做的是取消该导航,并使用 ShellExecute 将 URL 重定向到外部应用程序(这是 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.
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
(如果它不是您控制的合法页面,您可以删除该位)和m_strWebPage
我希望它锁定到的 URL。您可以使此检查更加灵活,例如,允许它在某个域上的任何位置导航,但在另一个窗口中打开指向另一个域的链接。
该代码也是为 C++Builder 2009 / 2010 编写的,因为它使用UnicodeString
了L
字符串前缀。您没有说您使用的是什么版本,但如果您使用的是 2007 或之前的转换版本WideString
。
干杯,
大卫
事实上,当你没有处理“webNewWindow2”的时候TCppWebBrowser
,你打开的链接TCppWebBrowser
会使用系统默认浏览器。您无需做任何事情。
有关更多代码TCppWebBrowser
,请参阅我找到的此链接:http:
//codeback.net/tag/tcppwebbrowser