最小化されているフォームを通常状態に戻すには、「フォームを最小化あるいは最大化する」で紹介しているように、WindowStateプロパティをFormWindowState.Normalにします。しかし、フォームが最小化される前は最大化状態だった可能性もあり、その場合は最大化した方がよいかもしれません。ここでは、最小化されているフォームを元に戻す時、前の状態が最大化されていた時は最大化し、そうでない時は通常状態にする方法を紹介します。
まず、フォームが最小化された時にその前の状態を覚えておくという方法が考えられます。フォームが最小化されたかどうかは、「フォームが最小化あるいは最大化されたことを知る」で説明しています。
以下に、この方法を使った具体例を示します。
'最小化されたフォームを元に戻す時の状態 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
//最小化されたフォームを元に戻す時の状態 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 messageをSC_RESTOREパラメータで送信すると、ウィンドウが元の状態に戻ります。この時、最小化されたウィンドウは、通常状態か最大化状態に戻ります。
以下に、この方法を使った例を示します。
'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
//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 functionにSW_RESTOREを渡して呼び出してウィンドウを元に戻しても、同じことができます。この例は、以下のようになります。
'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
//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 functionを使用すると、ウィンドウが復元された時の状態を知ることができます。これを基に、WindowStateプロパティで復元するという方法も考えられます。
この方法の例は、以下のようになります。
'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
//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; } } }