先の「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]
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]
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);
}
}
}
