Windows最大化后调用的事件

时间:2012-05-04 01:40:26

标签: c# winforms event-handling

我正在寻找一个来自之后>窗口最大化或最小化的窗体中的事件。

据我所知,有一些事件如SizeChanged或WndProc可以处理最大化的窗口,但是在用户尝试最大化窗口后立即调用它,并且在窗口完全最大化后不会调用它。

我正在寻找像ResizeEnd这样的事件,但也许这个被称为MaximizedEnd或MinimizedEnd

有没有这样做?

6 个答案:

答案 0 :(得分:6)

我认为这很简单:

protected override void OnSizeChanged(EventArgs e) {
  if (this.WindowState == FormWindowState.Maximized) {
    MessageBox.Show("Max!");
  }
  base.OnSizeChanged(e);
}

在窗口大小之后,不确定的含义。这也可能有效:

protected override void OnSizeChanged(EventArgs e) {
  if (this.WindowState == FormWindowState.Maximized) {
    this.BeginInvoke(new MethodInvoker(delegate { MessageBox.Show("Maxed"); }));
  }
  base.OnSizeChanged(e);
}

MessageBox.Show(...)替换为您的代码。

答案 1 :(得分:2)

使用resize,resizeBegin和resizeEnd事件可以在调整winform大小后执行某些操作。

private bool resize_flag = true;
    private void Form1_Resize(object sender, EventArgs e)
    {
        if (!resize_flag) return;
        //your code here
        resize_flag = true;
    }

    private void Form1_ResizeBegin(object sender, EventArgs e)
    {
        resize_flag = false;
    }

    private void Form1_ResizeEnd(object sender, EventArgs e)
    {
        //your code here
        resize_flag = true;
    }

这段代码很简单但有效! resizeEnd用于通过鼠标拖动调整大小,调整大小用于更改windowState,例如最大化或恢复。我认为重写WndProc()是好的,但是在winform调整大小之前它被解雇了......

答案 2 :(得分:1)

这就是加布里埃尔的解决方案的详细内容。我认为WindoStateChanged也没有事件。

我刚刚测试了这个解决方案,当你点击最大化按钮时它正在工作。它似乎被解雇了3次。我可能会做一些调试,并弄清楚你想拦截什么m.Msg以检查状态是否已经改变。我在这里http://www.autohotkey.com/docs/misc/SendMessageList.htm找到了一些WM_消息的快速参考。

    protected override void WndProc(ref Message m)
    {
        FormWindowState previousWindowState = this.WindowState;

        base.WndProc(ref m);

        FormWindowState currentWindowState = this.WindowState;

        if (previousWindowState != currentWindowState && currentWindowState == FormWindowState.Maximized)
        {
            // TODO: Do something the window has been maximized

        }
    }

如前所述,上述代码至少在我测试时被激活了3次。以下代码仅被触发一次。它有点冗长,但也可能更直观,更全面地解决你如何解雇事件的问题。感谢Yore对你的问题的评论。

public Form1()
{
    InitializeComponent();

    this.SizeChanged +=new EventHandler(Form1_SizeChanged);
    FormMaximized += new EventHandler(Form1_FormMaximized);

    _CurrentWindowState = this.WindowState;
    if (_CurrentWindowState == FormWindowState.Maximized)
    {
        FireFormMaximized();
    }
}

public event EventHandler FormMaximized;
private void FireFormMaximized()
{
    if (FormMaximized != null)
    {
        FormMaximized(this, EventArgs.Empty);
    }
}

private FormWindowState _CurrentWindowState;
private void Form1_SizeChanged(object sender, EventArgs e)
{
    if (this.WindowState == FormWindowState.Maximized && _CurrentWindowState != FormWindowState.Maximized)
    {
        FireFormMaximized();
    }
    _CurrentWindowState = this.WindowState;
}

void Form1_FormMaximized(object sender, EventArgs e)
{
    //TODO Put you're code here
}

答案 3 :(得分:0)

这可能不是您正在寻找的答案,但在窗口最大化后没有为Windows窗体定义的事件。如果要查找任何事件,您必须自己进入消息循环。通常,如果我想知道用户是否最大化窗口但不关心更改的大小,我会保存windowstate,如果它在SizedChanged上更改,我可以说窗口已最大化。

答案 4 :(得分:0)

我认为我们应该覆盖wndProc并触发WM_SYSCOMMAND事件。

protected override void WndProc(ref Message m)
    {
        if ((UInt32)m.Msg == Constant.WM_SYSCOMMAND)
        {
            switch ((UInt32)m.WParam)
            {
                case Constant.SC_MAXIMIZE:

                case Constant.SC_RESTORE:

                default:
                    break;
            }
        }
        base.WndProc(ref m);
    }

答案 5 :(得分:0)

我知道这是一个老话题,但是也许有人在寻找答案时会发现它。

您可以创建自己的自定义事件来完成您想要的事情。

声明事件:

Public Event Maximized(sender As Object, e As EventArgs)

引发自定义事件:

Private Sub frmMain_ResizeEnd(sender As Object, e As EventArgs) Handles Me.ResizeEnd
    If Me.WindowState = FormWindowState.Maximized Then RaiseEvent Maximized(sender, Nothing)
End Sub

处理您的自定义事件:

Private Sub frmMain_Maximized(sender As Object, e As EventArgs) Handles Me.Maximized

End Sub

Private Sub frmMain_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    AddHandler Me.Maximized, AddressOf MaximizedEventMethod
End Sub

Private Sub MaximizedEventMethod(sender As Object, e As EventArgs)
    'add your code here
End Sub