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

最小化されたフォームを元(通常か最大化状態)に戻す

最小化されているフォームを通常状態に戻すには、「フォームを最小化あるいは最大化する」で紹介しているように、WindowStateプロパティをFormWindowState.Normalにします。しかし、フォームが最小化される前は最大化状態だった可能性もあり、その場合は最大化した方がよいかもしれません。ここでは、最小化されているフォームを元に戻す時、前の状態が最大化されていた時は最大化し、そうでない時は通常状態にする方法を紹介します。

最小化される前の状態を覚えておく方法

まず、フォームが最小化された時にその前の状態を覚えておくという方法が考えられます。フォームが最小化されたかどうかは、「フォームが最小化あるいは最大化されたことを知る」で説明しています。

以下に、この方法を使った具体例を示します。

VB.NET
コードを隠すコードを選択
'最小化されたフォームを元に戻す時の状態
Private preWindowState As FormWindowState

'フォームのLoadイベントハンドラ
Private Sub Form1_Load(sender As Object, e As EventArgs) _
    Handles MyBase.Load

    '初期化
    If Me.WindowState = FormWindowState.Minimized Then
        Me.preWindowState = FormWindowState.Normal
    Else
        Me.preWindowState = Me.WindowState
    End If
End Sub

'SizeChangedイベントハンドラ
Private Sub Form1_SizeChanged(sender As Object, e As EventArgs) _
    Handles MyBase.SizeChanged

    '最小化された以外の時に、状態を覚えておく
    If Me.WindowState <> FormWindowState.Minimized Then
        Me.preWindowState = Me.WindowState
    End If
End Sub

'フォームが最小化されている時、元の状態に戻す
Public Sub RestoreMinimizedWindow()
    If Me.WindowState = FormWindowState.Minimized Then
        Me.WindowState = Me.preWindowState
    End If
End Sub
C#
コードを隠すコードを選択
//最小化されたフォームを元に戻す時の状態
private FormWindowState preWindowState;

//フォームのLoadイベントハンドラ
private void Form1_Load(object sender, EventArgs e)
{
    //初期化
    if (this.WindowState == FormWindowState.Minimized)
    {
        this.preWindowState = FormWindowState.Normal;
    }
    else
    {
        this.preWindowState = this.WindowState;
    }
}

//SizeChangedイベントハンドラ
private void Form1_SizeChanged(object sender, EventArgs e)
{
    //最小化された以外の時に、状態を覚えておく
    if (this.WindowState != FormWindowState.Minimized)
    {
        this.preWindowState = this.WindowState;
    }
}

//フォームが最小化されている時、元の状態に戻す
public void RestoreMinimizedWindow()
{
    if (this.WindowState == FormWindowState.Minimized)
    {
        this.WindowState = this.preWindowState;
    }
}

WM_SYSCOMMANDメッセージとSC_RESTOREを使用する方法

WM_SYSCOMMAND messageをSC_RESTOREパラメータで送信すると、ウィンドウが元の状態に戻ります。この時、最小化されたウィンドウは、通常状態か最大化状態に戻ります。

以下に、この方法を使った例を示します。

VB.NET
コードを隠すコードを選択
'Imports System.Runtime.InteropServices

<DllImport("user32.dll", CharSet:=CharSet.Auto)> _
Private Shared Function SendMessage(hWnd As IntPtr, Msg As UInteger, _
    wParam As IntPtr, lParam As IntPtr) As IntPtr
End Function

'フォームが最小化されている時、元の状態に戻す
Public Sub RestoreMinimizedWindow2()
    Const WM_SYSCOMMAND As UInteger = &H112
    Const SC_RESTORE As Integer = &HF120

    If Me.WindowState = FormWindowState.Minimized Then
        SendMessage(Me.Handle, WM_SYSCOMMAND, New IntPtr(SC_RESTORE), _
                    IntPtr.Zero)
    End If
End Sub
C#
コードを隠すコードを選択
//using System.Runtime.InteropServices;

[DllImport("user32.dll", CharSet = CharSet.Auto)]
private static extern IntPtr SendMessage(
    IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);

//フォームが最小化されている時、元の状態に戻す
public void RestoreMinimizedWindow2()
{
    const uint WM_SYSCOMMAND = 0x0112;
    const int SC_RESTORE = 0xF120;

    if (this.WindowState == FormWindowState.Minimized)
    {
        SendMessage(this.Handle, WM_SYSCOMMAND,
            new IntPtr(SC_RESTORE), IntPtr.Zero);
    }
}

ShowWindowとSW_RESTOREを使用する方法

ShowWindow functionにSW_RESTOREを渡して呼び出してウィンドウを元に戻しても、同じことができます。この例は、以下のようになります。

VB.NET
コードを隠すコードを選択
'Imports System.Runtime.InteropServices

<DllImport("user32.dll")> _
Private Shared Function ShowWindow(hWnd As IntPtr, Msg As UInteger) As Integer
End Function

'フォームが最小化されている時、元の状態に戻す
Public Sub RestoreMinimizedWindow3()
    Const SW_RESTORE As UInteger = &H9

    If Me.WindowState = FormWindowState.Minimized Then
        ShowWindow(Me.Handle, SW_RESTORE)
    End If
End Sub
C#
コードを隠すコードを選択
//using System.Runtime.InteropServices;

[DllImport("user32.dll")]
private static extern int ShowWindow(IntPtr hWnd, uint Msg);

//フォームが最小化されている時、元の状態に戻す
public void RestoreMinimizedWindow3()
{
    const uint SW_RESTORE = 0x09;

    if (this.WindowState == FormWindowState.Minimized)
    {
        ShowWindow(this.Handle, SW_RESTORE);
    }
}

GetWindowPlacementを使用して、元の状態を取得する方法

GetWindowPlacement functionを使用すると、ウィンドウが復元された時の状態を知ることができます。これを基に、WindowStateプロパティで復元するという方法も考えられます。

この方法の例は、以下のようになります。

VB.NET
コードを隠すコードを選択
'Imports System.Runtime.InteropServices

<DllImport("user32.dll")> _
Private Shared Function GetWindowPlacement( _
    hWnd As IntPtr, ByRef lpwndpl As WINDOWPLACEMENT) _
        As <MarshalAs(UnmanagedType.Bool)> Boolean
End Function

Private Structure WINDOWPLACEMENT
    Public length As Integer
    Public flags As Integer
    Public showCmd As Integer
    Public ptMinPosition As Point
    Public ptMaxPosition As Point
    Public rcNormalPosition As Rectangle
End Structure

'フォームが最小化されている時、元の状態に戻す
Public Sub RestoreMinimizedWindow4()
    Const WPF_RESTORETOMAXIMIZED As Integer = &H2

    If Me.WindowState = FormWindowState.Minimized Then
        Dim wp As New WINDOWPLACEMENT()
        wp.length = Marshal.SizeOf(wp)
        GetWindowPlacement(Me.Handle, wp)
        '最大化に戻すか調べる
        If (wp.flags And WPF_RESTORETOMAXIMIZED) = WPF_RESTORETOMAXIMIZED Then
            Me.WindowState = FormWindowState.Maximized
        Else
            Me.WindowState = FormWindowState.Normal
        End If
    End If
End Sub
C#
コードを隠すコードを選択
//using System.Runtime.InteropServices;

[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool GetWindowPlacement(
    IntPtr hWnd, ref WINDOWPLACEMENT lpwndpl);

private struct WINDOWPLACEMENT
{
    public int length;
    public int flags;
    public int showCmd;
    public Point ptMinPosition;
    public Point ptMaxPosition;
    public Rectangle rcNormalPosition;
}

//フォームが最小化されている時、元の状態に戻す
public void RestoreMinimizedWindow4()
{
    const int WPF_RESTORETOMAXIMIZED = 0x02;

    if (this.WindowState == FormWindowState.Minimized)
    {
        WINDOWPLACEMENT wp = new WINDOWPLACEMENT();
        wp.length = Marshal.SizeOf(wp);
        GetWindowPlacement(this.Handle, ref wp);
        //最大化に戻すか調べる
        if ((wp.flags & WPF_RESTORETOMAXIMIZED) == WPF_RESTORETOMAXIMIZED)
        {
            this.WindowState = FormWindowState.Maximized;
        }
        else
        {
            this.WindowState = FormWindowState.Normal;
        }
    }
}

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

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