ここでは、フォームが最小化、または最大化されたことを知る方法について説明します。
フォームが最小化あるいは最大化されると、フォームのサイズが変更されますので、SizeChangedイベントとResizeイベントが発生します。この時フォームのWindowStateプロパティを使ってウィンドウの状態が変化したかを調べれば、フォームが最小化あるいは最大化されたか確認することができます。
以下の例では、SizeChangedイベントハンドラでWindowStateプロパティを調べることで、フォームが最小化、最大化したことを感知しています。
'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
//SizeChangedイベントハンドラ private void Form1_SizeChanged(object sender, EventArgs e) { if (this.WindowState == FormWindowState.Minimized) { Console.WriteLine("最小化されました"); } else if (this.WindowState == FormWindowState.Maximized) { Console.WriteLine("最大化されました"); } }
めったにないことですが、最大化されたフォームのサイズと通常状態のフォームのサイズが同じ可能性もあります。この場合は、最大化されてもSizeChangedイベントやResizeイベントは発生しません。
補足:MSDNの「Form.MaximizeBox プロパティ」にあるメモには、「実行時にフォームを最大化すると、Resize イベントが生成されます。」とありますが、上記の条件では生成されないようです。
そのような場合でもWM_SIZEメッセージは送られてきますので、WM_SIZEが送られてきた時にWParamの値を調べることで、フォームが最小化、最大化されたことを知ることができます。
以下にその例を示します。このコードは、フォームクラス内に記述してください。
'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
//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); }