プログラムでは一種のチャットウィンドウとしてTCppWebBrowserコンポーネントを使用していますが、TCppwebrowserはIExplorerengineを使用しているため、クリックされたすべてのリンクがIExplorerで開かれます。私が持っているアイデアの1つは、Onbeforenavigate2のナビゲーションをキャンセルしてShell.executeを実行することですが、Windowsメッセージやイベントなどのよりエレガントなソリューションを期待している場合です。
3 に答える
TCppWebBrowserがDelphiのTWebBrowserのようなものであると仮定すると、以下のコードのようなものでうまくいくはずです。
OnBeforeNavigate2イベントは、TWebBrowserが新しいURLに移動する前に発生します。そのナビゲーションをキャンセルし、ShellExecuteを使用してURLを外部アプリケーション(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.
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を除きます。このチェックをより柔軟にして、たとえば、特定のドメインの任意の場所に移動しながら、別のウィンドウで別のドメインへのリンクを開くことができます。
UnicodeString
このコードは、L
文字列プレフィックスを使用しているため、C ++Builder2009/2010用にも記述されています。使用しているバージョンはわかりませんが、2007を使用している場合、またはWideString
代わりにキャストする前の場合。
乾杯、
デビッド
実際、の「webNewWindow2」を処理しなかった場合は、開いTCppWebBrowser
たリンクがTCppWebBrowser
システムのデフォルトブラウザとして使用されます。あなたがする必要があることは何もありません。
のその他のコードについてはTCppWebBrowser
、私が見つけた次のリンクを参照してください:http:
//codeback.net/tag/tcppwebbrowser