c# webBrowser.WindowClosing の作り方

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

        }

    }

}