如何检测窗口窗体何时被最小化?

我知道我可以通过 WindowState 获得当前状态,但是我想知道当用户试图最小化表单时是否会触发任何事件。

101133 次浏览

To get in before the form has been minimised you'll have to hook into the WndProc procedure:

    private const int WM_SYSCOMMAND = 0x0112;
private const int SC_MINIMIZE = 0xF020;


[SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
protected override void WndProc(ref Message m)
{
switch(m.Msg)
{
case WM_SYSCOMMAND:
int command = m.WParam.ToInt32() & 0xfff0;
if (command == SC_MINIMIZE)
{
// Do your action
}
// If you don't want to do the default action then break
break;
}
base.WndProc(ref m);
}

To react after the form has been minimised hook into the Resize event as the other answers point out (included here for completeness):

private void Form1_Resize (object sender, EventArgs e)
{
if (WindowState == FormWindowState.Minimized)
{
// Do your action
}
}

I don't know of a specific event, but the Resize event fires when the form is minimized, you can check for FormWindowState.Minimized in that event

You can use the Resize event and check the Forms.WindowState Property in the event.

private void Form1_Resize ( object sender , EventArgs e )
{
if ( WindowState == FormWindowState.Minimized )
{
// Do some stuff
}
}

For people who search for WPF windows minimizing event :

It's a bit different. For the callback use WindowState :

private void Form1_Resize(object sender, EventArgs e)
{
if (WindowState == FormWindowState.Minimized)
{
// Do some stuff
}
}

The event to use is StateChanged (instead Resize):

public Main()
{
InitializeComponent();
this.StateChanged += Form1_Resize;
}