■
新規ウィンドウ表示でIEが起動するのをなくそうと、
NewWindow で検索したら、色々引っかかりました。
http://main.tinyjoker.net/Tech/CSharp/WebBrowser%A5%B3%A5%F3%A5%C8%A5%ED%A1%BC%A5%EB%A4%CBNewWindow2%A5%A4%A5%D9%A5%F3%A5%C8%A4%F2%BC%C2%C1%F5%A4%B9%A4%EB.html
http://vsug.jp/tabid/63/forumid/45/threadid/9273/scope/posts/Default.aspx
上2つを組み合わせて、やっとできた。。
NewWindow2とNewWindow3の違いがわからない。。。
using System; using System.Collections.Generic; using System.Text; using System.Windows.Forms; using System.ComponentModel; using System.Runtime.InteropServices; using System.Security.Permissions; namespace ABCS.Classes { public class MySnapWebBrowser : WebBrowserEx { private string beforeurl_ = null; private Form parentForm_ = null; private TabControl tabcontrol_ = null; public MySnapWebBrowser(TabControl tabcontrol, Form parentForm) : base() { this.tabcontrol_ = tabcontrol; this.NewWindow2 += new WebBrowserNewWindow2EventHandler(webBrowser_NewWindow2); //this.BeforeNavigate += new EventHandler(OnBeforeNavigate); this.BeforeNewWindow += new EventHandler(OnMyBeforeNewWindow); this.parentForm_ = parentForm; } protected void OnMyBeforeNewWindow(object sender, EventArgs e) { WebBrowserExtendedNavigatingEventArgs we = e as WebBrowserExtendedNavigatingEventArgs; if (we != null) { this.beforeurl_ = we.Url; } } /* protected void OnBeforeNavigate(object sender, EventArgs e) { WebBrowserExtendedNavigatingEventArgs we = e as WebBrowserExtendedNavigatingEventArgs; //cancel = false; if( we != null ) { this.beforeurl_ = we.Url; } } */ // 新しくウィンドウを開かれようとするときに発生する void webBrowser_NewWindow2(object sender, WebBrowserNewWindow2EventArgs e) { MyTabPageWithWeb tab = new MyTabPageWithWeb(this.parentForm_, this.beforeurl_); // 新しい WebBrowser の初期化 //WebBrowserEx newBrowser = new WebBrowserEx(); //newBrowser.Dock = DockStyle.Fill; // 新しい WebBrowser のコンテナ(下記はタブの場合) //var tabPage = new TabPage(); //tab.Controls.Add(newBrowser); this.tabcontrol_.TabPages.Add(tab); // 新しい WebBrowser に表示させる設定 //e.ppDisp = newBrowser.Application; //newBrowser.RegisterAsBrowser = true; e.ppDisp = tab.ChildWebBrowser.Application; tab.ChildWebBrowser.RegisterAsBrowser = true; // 新しい WebBrowser からさらにウィンドウを開かれるときも同じようにする //newBrowser.NewWindow2 += webBrowser_NewWindow2; tab.ChildWebBrowser.NewWindow2 += webBrowser_NewWindow2; //newBrowser.Navigate(this.beforeurl_); //tab.ChildWebBrowser.Navigate(this.beforeurl_); this.tabcontrol_.SelectTab(tab); e.Cancel = true; } } 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); } } }