■
パーツその1:WebBrowserEx.cs
(パーツ2も作ってください)
using System; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServices; using System.ComponentModel; using System.Windows.Forms; using System.Security.Permissions; namespace ABCS.Classes { public class WebBrowserEx : ExtendedWebBrowser { #region NewWindow2 イベント関連 private AxHost.ConnectionPointCookie cookie; private WebBrowser2EventHelper helper; [DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Hidden)] [DispIdAttribute(200)] public object Application { get { if (this.ActiveXInstance == null) { throw new AxHost.InvalidActiveXStateException("Application", AxHost.ActiveXInvokeKind.PropertyGet); } return (this.ActiveXInstance as IWebBrowser2).Application; } } [DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Hidden)] [DispIdAttribute(552)] public bool RegisterAsBrowser { get { if (this.ActiveXInstance == null) { throw new AxHost.InvalidActiveXStateException("RegisterAsBrowser", AxHost.ActiveXInvokeKind.PropertyGet); } return (this.ActiveXInstance as IWebBrowser2).RegisterAsBrowser; } set { if (this.ActiveXInstance == null) { throw new AxHost.InvalidActiveXStateException("RegisterAsBrowser", AxHost.ActiveXInvokeKind.PropertyGet); } (this.ActiveXInstance as IWebBrowser2).RegisterAsBrowser = value; } } [PermissionSetAttribute(SecurityAction.LinkDemand, Name = "FullTrust")] protected override void CreateSink() { base.CreateSink(); helper = new WebBrowser2EventHelper(this); cookie = new AxHost.ConnectionPointCookie(this.ActiveXInstance, helper, typeof(DWebBrowserEvents2)); } [PermissionSetAttribute(SecurityAction.LinkDemand, Name = "FullTrust")] protected override void DetachSink() { if (cookie != null) { cookie.Disconnect(); cookie = null; } base.DetachSink(); } public event WebBrowserNewWindow2EventHandler NewWindow2; protected virtual void OnNewWindow2(WebBrowserNewWindow2EventArgs e) { NewWindow2(this, e); } private class WebBrowser2EventHelper : StandardOleMarshalObject, DWebBrowserEvents2 { private WebBrowserEx parent; public WebBrowser2EventHelper(WebBrowserEx parent) { this.parent = parent; } public void NewWindow2(ref object ppDisp, ref bool cancel) { WebBrowserNewWindow2EventArgs e = new WebBrowserNewWindow2EventArgs(ppDisp); this.parent.OnNewWindow2(e); ppDisp = e.ppDisp; cancel = e.Cancel; } void ABCS.Classes.ExtendedWebBrowser.DWebBrowserEvents2.NewWindow3(object ppDisp, ref bool cancel, ref object a2, ref object a3, ref object a4) { WebBrowserNewWindow2EventArgs e = new WebBrowserNewWindow2EventArgs(ppDisp); this.parent.OnNewWindow2(e); ppDisp = e.ppDisp; cancel = e.Cancel; } void ABCS.Classes.ExtendedWebBrowser.DWebBrowserEvents2.BeforeNavigate2(object sender, ref object a1, ref object a2, ref object a3, ref object a4, ref object a5, ref bool a6) { } } #endregion } public delegate void WebBrowserNewWindow2EventHandler(object sender, WebBrowserNewWindow2EventArgs e); public class WebBrowserNewWindow2EventArgs : CancelEventArgs { private object ppdisp_ = null; public object ppDisp { get { return this.ppdisp_; } set { this.ppdisp_ = value; } } public WebBrowserNewWindow2EventArgs(object ppDisp) { this.ppDisp = ppDisp; } } [ComImport, Guid("34A715A0-6587-11D0-924A-0020AFC7AC4D")] [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)] [TypeLibType(TypeLibTypeFlags.FHidden)] public interface DWebBrowserEvents2 { [DispId(251)] void NewWindow2( [InAttribute(), OutAttribute(), MarshalAs(UnmanagedType.IDispatch)] ref object ppDisp, [InAttribute(), OutAttribute()] ref bool cancel); } [ComImport, Guid("D30C1661-CDAF-11D0-8A3E-00C04FC9E26E")] [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)] public interface IWebBrowser2 { object Application { get; } bool RegisterAsBrowser { get; set; } } 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 : System.Windows.Forms.WebBrowser { protected string url_ = null; System.Windows.Forms.AxHost.ConnectionPointCookie cookie; WebBrowserExtendedEvents events; //This method will be called to give you a chance to create your own event sink protected override void CreateSink() { //MAKE SURE TO CALL THE BASE or the normal events won't fire base.CreateSink(); events = new WebBrowserExtendedEvents(this); cookie = new System.Windows.Forms.AxHost.ConnectionPointCookie(this.ActiveXInstance, events, typeof(DWebBrowserEvents2)); } protected override void DetachSink() { if (null != cookie) { cookie.Disconnect(); cookie = null; } base.DetachSink(); } //This new event will fire when the page is navigating public event EventHandler BeforeNavigate; public event EventHandler BeforeNewWindow; protected void OnBeforeNewWindow(string url, out bool cancel) { EventHandler h = BeforeNewWindow; WebBrowserExtendedNavigatingEventArgs args = new WebBrowserExtendedNavigatingEventArgs(url, null); if (null != h) { h(this, args); } cancel = args.Cancel; } protected void OnBeforeNavigate(string url, string frame, out bool cancel) { EventHandler h = BeforeNavigate; WebBrowserExtendedNavigatingEventArgs args = new WebBrowserExtendedNavigatingEventArgs(url, frame); if (null != h) { h(this, args); } //Pass the cancellation chosen back out to the events cancel = args.Cancel; } //This class will capture events from the WebBrowser class WebBrowserExtendedEvents : System.Runtime.InteropServices.StandardOleMarshalObject, DWebBrowserEvents2 { ExtendedWebBrowser _Browser; public WebBrowserExtendedEvents(ExtendedWebBrowser browser) { _Browser = browser; } //Implement whichever events you wish public void BeforeNavigate2(object pDisp, ref object URL, ref object flags, ref object targetFrameName, ref object postData, ref object headers, ref bool cancel) { _Browser.OnBeforeNavigate((string)URL, (string)targetFrameName, out cancel); _Browser.url_ = URL.ToString(); } public void NewWindow3(object pDisp, ref bool cancel, ref object flags, ref object URLContext, ref object URL) { _Browser.OnBeforeNewWindow((string)URL, out cancel); } } [System.Runtime.InteropServices.ComImport(), System.Runtime.InteropServices.Guid("34A715A0-6587-11D0-924A-0020AFC7AC4D"), System.Runtime.InteropServices.InterfaceTypeAttribute(System.Runtime.InteropServices.ComInterfaceType.InterfaceIsIDispatch), System.Runtime.InteropServices.TypeLibType(System.Runtime.InteropServices.TypeLibTypeFlags.FHidden)] public interface DWebBrowserEvents2 { [System.Runtime.InteropServices.DispId(250)] void BeforeNavigate2( [System.Runtime.InteropServices.In, System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.IDispatch)] object pDisp, [System.Runtime.InteropServices.In] ref object URL, [System.Runtime.InteropServices.In] ref object flags, [System.Runtime.InteropServices.In] ref object targetFrameName, [System.Runtime.InteropServices.In] ref object postData, [System.Runtime.InteropServices.In] ref object headers, [System.Runtime.InteropServices.In, System.Runtime.InteropServices.Out] ref bool cancel); [System.Runtime.InteropServices.DispId(273)] void NewWindow3( [System.Runtime.InteropServices.In, System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.IDispatch)] object pDisp, [System.Runtime.InteropServices.In, System.Runtime.InteropServices.Out] ref bool cancel, [System.Runtime.InteropServices.In] ref object flags, [System.Runtime.InteropServices.In] ref object URLContext, [System.Runtime.InteropServices.In] ref object URL); } } }
パーツその2:MyWebBrowser.cs
using System; using System.Collections.Generic; using System.Text; namespace ABCS.Classes { public class MyWebBrowser : WebBrowserEx { private string beforeurl_ = null; public MyWebBrowser() : base() { this.NewWindow2 += new WebBrowserNewWindow2EventHandler(myWebBrowser_NewWindow2); this.BeforeNewWindow += new EventHandler(OnMyBeforeNewWindow); } protected void OnMyBeforeNewWindow(object sender, EventArgs e) { WebBrowserExtendedNavigatingEventArgs we = e as WebBrowserExtendedNavigatingEventArgs; if (we != null) { this.beforeurl_ = we.Url; } } // 新しくウィンドウを開かれようとするときに発生する void myWebBrowser_NewWindow2(object sender, WebBrowserNewWindow2EventArgs e) { this.Navigate(this.beforeurl_); e.Cancel = true; } } }