如何检测何时最小化Windows窗体?


84

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

Answers:


122

您可以使用Resize事件并检查事件中的Forms.WindowState属性。

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

2
请注意,这似乎是可以吞下异常的地方之一。
Jonathon Reinhart

1
您还需要this.Resize + = new System.EventHandler(this.Form1_Resize);
汤姆(Tom)

79

要在最小化表单之前进入,您必须加入WndProc过程:

    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);
    }

在最小化表单做出反应Resize如其他答案所指出的,请挂接到事件中(为完整性起见,请参见此处):

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

从正常窗口状态最大化时为0xF030。从窗口栏最大化时为
0xF120

实际上,这仅捕获了Minimize Click事件!您正在寻找的是WM_SIZE(0x0005)&SIZE_MINIMIZED(1)
Ori Nachum

17

我不知道特定的事件,但是在Resize最小化表单时会触发该事件,您可以FormWindowState.Minimized在该事件中进行检查


2
结合使用私有的“ lastState”标志是最简单的方法。
马修·沙利

7

对于搜索WPF窗口最小化事件的用户:

有点不同。对于回调,请使用WindowState:

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

要使用的事件是StateChanged(而非Resize):

public Main()
{
    InitializeComponent();
    this.StateChanged += Form1_Resize;
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.