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

Jor*_*nco 77 c# winforms

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

Ste*_*nan 112

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

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

  • 请注意,这似乎是[可以吞下例外]的地方之一(http://stackoverflow.com/q/4933958/119527). (2认同)

Chr*_*isF 74

要在表单最小化之前进入,您必须挂钩到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);
    }
Run Code Online (Sandbox Code Playgroud)

在表单被最小化之后做出反应,Resize如其他答案所指出的那样挂钩事件(此处包括完整性):

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


Dan*_*n F 17

我不知道具体事件,但是Resize当窗体最小化时事件会触发,您可以FormWindowState.Minimized在该事件中检查

  • 这与私有的"lastState"标志相结合是最简单的方法. (2认同)

小智 6

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

这有点不同.对于回调使用WindowState:

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

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

public Main()
{
    InitializeComponent();
    this.StateChanged += Form1_Resize;
}
Run Code Online (Sandbox Code Playgroud)