「新規ウィンドウを開くタイプのリンク」を踏んだ時の飛び先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)
private void extendedWebBrowser_ExtendedNewWindow(object sender, ExtWebBrowser.WebBrowserExtendedNavigatingEventArgs e)
{
var url = e.Url;
}
上記の例にある引数「e」のUrlプロパティを参照すると、飛び先のURLが入っています。