WebBrowserを拡張してみました
環境はVisuasStudio2010です。
WebBrowserコントロールを使って、Webサイトのタグをたどってリンクを踏むプログラムを書いていました。
「新規ウィンドウを開くタイプのリンク」を踏んだ時の飛び先URL
これを取得するためにWebBrowserコントロールの「NewWindow」イベントを利用しようとしました。
URLの情報があるだろうと思っていたら、、、、取得できないんですね。
Google先生に聞いてみると、同じ様に飛び先のURLを取得するために試行錯誤している人が沢山いらっしゃいます。
行き着く先は、マイクロソフトのサポートページだったわけですが、なぜか現在はそのページを開くことが出来ません。
※リンク切れになっています。
そこで、参考サイトを参考にして、WebBrowserを継承した拡張コントロールを作ってみました。
プロジェクトの新規作成で「クラスライブラリ」を作成。 <- 名前:ExtendedWebBrowser.cs
プロジェクト名を「ExtWebBrowser」としました。
ソースコードはこんな感じです。
ExtendedNewWindowイベントとExtendedNavigatingイベントが追加されています。
それ以外は標準のWebBrowserコントロールと一緒です。
using System; using System.ComponentModel; using System.Windows.Forms; using System.Runtime.InteropServices; namespace ExtWebBrowser { public class WebBrowserExtendedNavigatingEventArgs : CancelEventArgs { private string _Url; public string Url { get { return _Url; } } private string _Frame; public string Frame { get { return _Frame; } } public WebBrowserExtendedNavigatingEventArgs(string url, string frame) : base() { _Url = url; _Frame = frame; } } public class ExtendedWebBrowser : WebBrowser { AxHost.ConnectionPointCookie cookie; WebBrowserExtendedEvents events; protected override void CreateSink() { base.CreateSink(); events = new WebBrowserExtendedEvents(this); cookie = new AxHost.ConnectionPointCookie(this.ActiveXInstance, events, typeof(DWebBrowserEvents2)); } protected override void DetachSink() { if (null != cookie) { cookie.Disconnect(); cookie = null; } base.DetachSink(); } public event EventHandler<WebBrowserExtendedNavigatingEventArgs> ExtendedNavigating; public event EventHandler<WebBrowserExtendedNavigatingEventArgs> ExtendedNewWindow; protected void OnExtendedNavigating(string url, string frame, out bool cancel) { EventHandler<WebBrowserExtendedNavigatingEventArgs> h = ExtendedNavigating; WebBrowserExtendedNavigatingEventArgs args = new WebBrowserExtendedNavigatingEventArgs(url, frame); if (null != h) { h(this, args); } cancel = args.Cancel; } protected void OnExtendedNewWindow(string url, out bool cancel) { EventHandler<WebBrowserExtendedNavigatingEventArgs> h = ExtendedNewWindow; WebBrowserExtendedNavigatingEventArgs args = new WebBrowserExtendedNavigatingEventArgs(url, null); if (null != h) { h(this, args); } cancel = args.Cancel; } class WebBrowserExtendedEvents : StandardOleMarshalObject, DWebBrowserEvents2 { ExtendedWebBrowser _Browser; public WebBrowserExtendedEvents(ExtendedWebBrowser browser) { _Browser = browser; } public void BeforeNavigate2(object pDisp, ref object URL, ref object flags, ref object targetFrameName, ref object postData, ref object headers, ref bool cancel) { _Browser.OnExtendedNavigating((string)URL, (string)targetFrameName, out cancel); } public void NewWindow3(object pDisp, ref bool cancel, ref object flags, ref object URLContext, ref object URL) { _Browser.OnExtendedNewWindow((string)URL, out cancel); } } [ComImport(), Guid("34A715A0-6587-11D0-924A-0020AFC7AC4D"), InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIDispatch), TypeLibType(TypeLibTypeFlags.FHidden)] public interface DWebBrowserEvents2 { [DispId(250)] void BeforeNavigate2([In, MarshalAs(UnmanagedType.IDispatch)] object pDisp, [In] ref object URL, [In] ref object flags, [In] ref object targetFrameName, [In] ref object postData, [In] ref object headers, [In, Out] ref bool cancel); [DispId(273)] void NewWindow3( [In, MarshalAs(UnmanagedType.IDispatch)] object pDisp, [In, Out] ref bool cancel, [In] ref object flags, [In] ref object URLContext, [In] ref object URL); } } }
利用方法
このプロジェクトをビルドして保存します。
以上です。
作ったコントロールを使いたいときは、ExtWebBrowserプロジェクトを利用したいソリューションに追加して使います。
すると、ツールボックスに自動的に「ExtendedWebBrowser」が追加されています。
※アイコンが歯車
WebBrowserコントロールと同じ様に、D&DでFormに貼り付けられます。
ExtendedNewWindowイベント
これを利用します。
新規ウィンドウを作るタイプのリンクを踏むと、このイベントが呼ばれます。
private void extendedWebBrowser_ExtendedNewWindow(object sender, ExtWebBrowser.WebBrowserExtendedNavigatingEventArgs e) /// <summary> /// 拡張Webbrowserコントロール:Webページ新規ウィンドウで開くイベント /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void extendedWebBrowser_ExtendedNewWindow(object sender, ExtWebBrowser.WebBrowserExtendedNavigatingEventArgs e) { var url = e.Url; // 飛び先のURLを取得できる }
上記の例にある引数「e」のUrlプロパティを参照すると、飛び先のURLが入っています。
プロジェクトを追加するのではなくDLLを参照して使いたい時
- コントロールを追加したいソリューションを開く
- ソリューション直下のフォルダにExtWebBrowserプロジェクトのbinフォルダの中にあるExtWebBrowser.dllをコピー
- ツールボックスのコントロールを右クリック → アイテムの選択 → .NET Frameworkコンポーネント → 参照
- ソリューション直下のフォルダにコピーしたExtWebBrowser.dllを指定
すると、ツールボックスにExtendedWebBrowserコントロールが追加されます。