先の「c# webBrowser.NewWindow2 の作り方」でご紹介した [WebBrowserEx.cs] にWindowsClosingイベントを追加する方法です。
これもまたよくあることだと思いますが、webBrowserコントロールにWindowsClosingイベントがないために、たとえば、「閉じる」ボタンをクリックしたときなどフォームを自動で閉じずに残ってしまうため、フリーズしたような状態になってしまいます。
このような場合に以下のようなクラスを作成しておくことにより、フォームを自動で閉じることができるようになります。(※ソースは他からのコピーを記載しています。元々VBなものをC#に変換しました。)
◆利用手順◆
1.「c# webBrowser.NewWindow2 の作り方」で作成したプロジェクトを開く。
2.クラスの追加をする。(中身は、以下記載のソース [WebBrowserEx2.cs] と入れ替える。)
3.ツールボックスに WebBrowserEx2 コンポーネントが追加されたことを確認する。(追加されない場合は、ソリューションリビルドする。)
4.Form1.cs をコード表示し、以下掲載のソース [Form1.cs] の内容を追記する。
[WebBrowserEx2.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 |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows.Forms; using System.Runtime.InteropServices; namespace WebBrowserEx2Test { public class WebBrowserEx2 : WebBrowserEx { public WebBrowserEx2() : base() { } //WindowClosingイベントの拡張 public enum GETWINDOWCMD { GW_HWNDFIRST = 0, GW_HWNDLAST = 1, GW_HWNDNEXT = 2, GW_HWNDPREV = 3, GW_OWNER = 4, GW_CHILD = 5, GW_ENABLEDPOPUP = 6 } [DllImport(“user32.dll”)] private static extern IntPtr GetWindow(IntPtr hWnd, GETWINDOWCMD uCmd); public event EventHandler WindowClosing; protected virtual void OnWindowClosing(EventArgs e) { if (WindowClosing != null) { WindowClosing(this, e); } } protected override void WndProc(ref System.Windows.Forms.Message m) { const Int32 WM_PARENTNOTIFY = 0x210; const Int32 WM_DESTROY = 0x2; if (m.Msg == WM_PARENTNOTIFY) { if (m.WParam.ToInt32() == WM_DESTROY) { if (m.LParam == GetWindow(this.Handle, GETWINDOWCMD.GW_CHILD)) { EventArgs e = new EventArgs(); OnWindowClosing(e); return; } } } base.WndProc(ref m); } } } |
[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 64 65 66 67 68 69 70 71 |
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 WebBrowserEx2Test; namespace WindowsFormsApplication1 { public partial class Form1 : Form { TabControl TabControl1 = new TabControl(); WebBrowserEx2 WebBrowser1; TabPage TabPage1; public Form1() { InitializeComponent(); } private void webBrowserEx2_NewWindow2(object sender, ReinsKensaku2011.WebBrowserNewWindow2EventArgs e) { //WebBrowser1 this.WebBrowser1 = new WebBrowserEx2(); this.WebBrowser1.Dock = DockStyle.Fill; WebBrowser1.NewWindow2 += webBrowserEx1_NewWindow2; webBrowserEx1.WindowClosing += webBrowserEx1_WindowClosing; //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 WebBrowserEx2(); this.WebBrowser1.Dock = DockStyle.Fill; WebBrowser1.NewWindow2 += webBrowserEx1_NewWindow2; webBrowserEx1.WindowClosing += webBrowserEx1_WindowClosing; //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(); } //「閉じる」ボタンなどでウィンドウが閉じられるときに発生する private void webBrowser1_WindowClosing(object sender, EventArgs e) { this.TabControl1.Controls.Remove(TabPage1); } } } |