DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

フォームが最小化あるいは最大化されたことを知る

ここでは、フォームが最小化、または最大化されたことを知る方法について説明します。

SizeChangedイベントを使用する方法

フォームが最小化あるいは最大化されると、フォームのサイズが変更されますので、SizeChangedイベントResizeイベントが発生します。この時フォームのWindowStateプロパティを使ってウィンドウの状態が変化したかを調べれば、フォームが最小化あるいは最大化されたか確認することができます。

以下の例では、SizeChangedイベントハンドラでWindowStateプロパティを調べることで、フォームが最小化、最大化したことを感知しています。

VB.NET
コードを隠すコードを選択
'SizeChangedイベントハンドラ
Private Sub Form1_SizeChanged(sender As Object, e As EventArgs) _
    Handles MyBase.SizeChanged

    If Me.WindowState = FormWindowState.Minimized Then
        Console.WriteLine("最小化されました")
    ElseIf Me.WindowState = FormWindowState.Maximized Then
        Console.WriteLine("最大化されました")
    End If
End Sub
C#
コードを隠すコードを選択
//SizeChangedイベントハンドラ
private void Form1_SizeChanged(object sender, EventArgs e)
{
    if (this.WindowState == FormWindowState.Minimized)
    {
        Console.WriteLine("最小化されました");
    }
    else if (this.WindowState == FormWindowState.Maximized)
    {
        Console.WriteLine("最大化されました");
    }
}

WM_SIZEを使用する方法

めったにないことですが、最大化されたフォームのサイズと通常状態のフォームのサイズが同じ可能性もあります。この場合は、最大化されてもSizeChangedイベントやResizeイベントは発生しません。

補足:MSDNの「Form.MaximizeBox プロパティ」にあるメモには、「実行時にフォームを最大化すると、Resize イベントが生成されます。」とありますが、上記の条件では生成されないようです。

そのような場合でもWM_SIZEメッセージは送られてきますので、WM_SIZEが送られてきた時にWParamの値を調べることで、フォームが最小化、最大化されたことを知ることができます。

以下にその例を示します。このコードは、フォームクラス内に記述してください。

VB.NET
コードを隠すコードを選択
'Imports System.Security.Permissions

<SecurityPermission(SecurityAction.Demand, _
    Flags:=SecurityPermissionFlag.UnmanagedCode)> _
Protected Overrides Sub WndProc(ByRef m As Message)
    Const WM_SIZE As Integer = &H5
    Const SIZE_RESTORED As Integer = &H0
    Const SIZE_MINIMIZED As Integer = &H1
    Const SIZE_MAXIMIZED As Integer = &H2

    If m.Msg = WM_SIZE Then
        Select Case m.WParam.ToInt32()
            Case SIZE_RESTORED
                '通常状態でサイズが変更されたか、通常状態に戻ったか
                Console.WriteLine("通常状態です")
                Exit Select
            Case SIZE_MINIMIZED
                Console.WriteLine("最小化されました")
                Exit Select
            Case SIZE_MAXIMIZED
                Console.WriteLine("最大化されました")
                Exit Select
        End Select
    End If

    MyBase.WndProc(m)
End Sub
C#
コードを隠すコードを選択
//using System.Security.Permissions;

[SecurityPermission(SecurityAction.Demand,
    Flags = SecurityPermissionFlag.UnmanagedCode)]
protected override void WndProc(ref Message m)
{
    const int WM_SIZE = 0x5;
    const int SIZE_RESTORED = 0x0;
    const int SIZE_MINIMIZED = 0x1;
    const int SIZE_MAXIMIZED = 0x2;

    if (m.Msg == WM_SIZE)
    {
        switch (m.WParam.ToInt32())
        {
            case SIZE_RESTORED:
                //通常状態でサイズが変更されたか、通常状態に戻ったか
                Console.WriteLine("通常状態です");
                break;
            case SIZE_MINIMIZED:
                Console.WriteLine("最小化されました");
                break;
            case SIZE_MAXIMIZED:
                Console.WriteLine("最大化されました");
                break;
        }
    }

    base.WndProc(ref m);
}

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • イベントハンドラの意味が分からない、C#のコードをそのまま書いても動かないという方は、こちらをご覧ください。
  • コードの先頭に記述されている「Imports ??? がソースファイルの一番上に書かれているものとする」(C#では、「using ???; がソースファイルの一番上に書かれているものとする」)の意味が分からないという方は、こちらをご覧ください。
  • .NET Tipsをご利用いただく際は、注意事項をお守りください。