web-dev-qa-db-ja.com

CefSharpでポップアップリンクを処理する方法

CefSharp 39.0.2を使用してタブ付きWebブラウザを作成しています。現在、ユーザーがWebサイトのリンクをクリックすると、元のUIがない新しいウィンドウが開きます。たとえば、Googleニュースの記事のリンクをクリックすると、新しいウィンドウで開きますが、私が作成したブラウジングコントロールはありません。 Cef.WinForms.Exampleプログラムも調べましたが、まったく同じことをします。

これを別の方法で処理することは可能ですか?リンクを新しいタブで開くか、新しいウィンドウで開きます(すべてのコントロールがそこにあります)。私はGitHubの問題を調べていましたが、このようなものは見つかりませんでした(これは他の人もやりたいことだと思うので、十分に調べていなかったのかもしれません...)。ブラウザコントロールのすべてのeventsを調べましたが、処理しているように見えるものは見つかりませんでした。

12
AJDev

ChromiumWebBrowserにはLifeSpanHandlerプロパティがあります。 Cefsharpでポップアップウィンドウを手動で制御するには、ILifeSpanHandleインターフェイスを実装する独自のライフスパンハンドラオブジェクトを実装する必要があります。

ブラウザが新しいウィンドウを開きたいときはいつでも、ライフスパンハンドラのOnBeforePopup関数を呼び出します。ここで、目的の動作を実装できます。 falseを返すと、ブラウザは新しいウィンドウをポップアップします。 trueを返すと、ブラウザはポップアップアクションを無視しますが、新しいウィンドウや新しいタブなどを手動で作成できます...

これは、カスタムライフスパンハンドラーの非常に単純な例です。ポップアップリクエストでは、PopupRequestというイベントを発生させます。このようなイベントをサブスクライブして、新しいウィンドウ/タブを手動で作成できます。次に、ChromiumWebBrowserに独自の新しいウィンドウを作成しないように指示するtrueを返します。ただし、別のChromiumWebBrowserを使用して新しいウィンドウを作成することを自分で実装する必要があります。

public class SampleLifeSpanHandler: ILifeSpanHandler
{
    public event Action<string> PopupRequest;

    public bool OnBeforePopup(IWebBrowser browser, string sourceUrl, string targetUrl, ref int x, ref int y, ref int width,
        ref int height)
    {
        if (PopupRequest != null)
            PopupRequest(targetUrl);

        return true;
    }

    public void OnBeforeClose(IWebBrowser browser)
    {

    }
}
15
Viktor Chvátal