1

プログラムでは一種のチャットウィンドウとしてTCppWebBrowserコンポーネントを使用していますが、TCppwebrowserはIExplorerengineを使用しているため、クリックされたすべてのリンクがIExplorerで開かれます。私が持っているアイデアの1つは、Onbeforenavigate2のナビゲーションをキャンセルしてShell.executeを実行することですが、Windowsメッセージやイベントなどのよりエレガントなソリューションを期待している場合です。

4

3 に答える 3

7

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.
于 2009-10-13T08:40:29.177 に答える
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(制御可能なページでない場合はそのビットを削除できます)と、m_strWebPageロックしたいURLを除きます。このチェックをより柔軟にして、たとえば、特定のドメインの任意の場所に移動しながら、別のウィンドウで別のドメインへのリンクを開くことができます。

UnicodeStringこのコードは、L文字列プレフィックスを使用しているため、C ++Builder2009/2010用にも記述されています。使用しているバージョンはわかりませんが、2007を使用している場合、またはWideString代わりにキャストする前の場合。

乾杯、

デビッド

于 2009-10-13T23:21:05.010 に答える
0

実際、の「webNewWindow2」を処理しなかった場合は、開いTCppWebBrowserたリンクがTCppWebBrowserシステムのデフォルトブラウザとして使用されます。あなたがする必要があることは何もありません。

のその他のコードについてはTCppWebBrowser、私が見つけた次のリンクを参照してください:http: //codeback.net/tag/tcppwebbrowser

于 2010-11-22T10:35:16.067 に答える