5

我正在从窗口最大化或最小化后调用的表单中寻找一个事件。

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

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

有没有办法做到这一点?

4

6 回答 6

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(...)用您的代码替换。

于 2012-05-04T02:24:11.523 回答
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 用于通过鼠标拖动调整大小,resize 用于更改窗口状态,例如最大化或恢复。我认为覆盖 WndProc() 很好,但是在调整 winform 大小之前它被解雇了,所以......

于 2016-11-22T11:25:40.203 回答
1

这就是 Gabriel 的解决方案的详细信息。我认为 WindoStateChanged 也没有事件。

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

    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
}
于 2012-05-04T02:02:07.647 回答
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);
    }
于 2014-08-22T11:56:38.580 回答
0

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

于 2012-05-04T01:45:08.027 回答
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
于 2019-05-19T12:56:36.713 回答