多分、同じようなことで悩んでいる方が多いことと思います。
webBrowserを利用するプログラムを書いていると、リンクなどをクリックし別ウインドウが開かれるような場合、IEが起動してしまい、クッキーの連携が絶たれてしまいます。
このような場合に以下のようなクラスを作成しておくことにより、IEを開かずに自身が作成したwebBrowserを開くことができます。(※ソースはすべて他からのコピーを記載しています。大変、便利なものを作られる方がいるものです。)
◆利用手順◆
1.C#で新規プロジェクト(Windowsフォーム)を作成する。
2.クラスの追加をする。(中身は、以下記載のソース [WebBrowserEx.cs] と入れ替える。)
3.ツールボックスに WebBrowserEx コンポーネントが追加されたことを確認する。(追加されない場合は、ソリューションリビルドする。)
4.Form1.cs をコード表示し、以下掲載のソース [Form1.cs] の内容を追記する。
[WebBrowserEx.cs]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows.Forms; using System.ComponentModel; using System.Runtime.InteropServices; using System.Security.Permissions; namespace WebBrowserExTest { public class WebBrowserEx : WebBrowser { #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 = (o, e) => { }; 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) { var e = new WebBrowserNewWindow2EventArgs(ppDisp); this.parent.OnNewWindow2(e); ppDisp = e.ppDisp; cancel = e.Cancel; } } #endregion } public delegate void WebBrowserNewWindow2EventHandler(object sender, WebBrowserNewWindow2EventArgs e); public class WebBrowserNewWindow2EventArgs : CancelEventArgs { public object ppDisp { get; set; } 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; } } } |
[Form1.cs]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using WebBrowserExTest; namespace WindowsFormsApplication1 { public partial class Form1 : Form { TabControl TabControl1 = new TabControl(); WebBrowserEx WebBrowser1; TabPage TabPage1; public Form1() { InitializeComponent(); } private void webBrowserEx1_NewWindow2(object sender, ReinsKensaku2011.WebBrowserNewWindow2EventArgs e) { //WebBrowser1 this.WebBrowser1 = new WebBrowserEx(); this.WebBrowser1.Dock = DockStyle.Fill; WebBrowser1.NewWindow2 += webBrowserEx1_NewWindow2; //TabPage1 this.TabPage1 = new TabPage(); this.TabPage1.Controls.Add(WebBrowser1); //TabControl this.TabControl1.Controls.Add(TabPage1); this.TabControl1.SelectedTab = TabPage1; //新しいウィンドウが開くのを抑制 e.ppDisp = this.WebBrowser1.Application; this.WebBrowser1.RegisterAsBrowser = true; } private void Form1_Load(object sender, EventArgs e) { //WebBrowser1 this.WebBrowser1 = new WebBrowserEx(); this.WebBrowser1.Dock = DockStyle.Fill; WebBrowser1.NewWindow2 += webBrowserEx1_NewWindow2; //TabPage1 this.TabPage1 = new TabPage(); this.TabPage1.Controls.Add(WebBrowser1); //TabControl this.TabControl1.Dock = DockStyle.Fill; this.TabControl1.TabPages.Add(TabPage1); //Form1 this.Text = "WebBrowserNewWindow2Event"; this.Controls.Add(this.TabControl1); // this.WebBrowser1.GoHome(); } } } |