Windows最大化后调用的事件

euc*_*135 4 c# event-handling winforms

我正在寻找窗体最大化或最小化调用的窗体中的事件.

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

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

反正有吗?

Lar*_*ech 6

我认为这很简单:

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

窗口大小,不确定您的意思.这也可能有用:

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

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


Dan*_*n P 1

这就是加布里埃尔解决方案的详细内容。我认为也没有 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

        }
    }
Run Code Online (Sandbox Code Playgroud)

如上所述,在我测试期间,上面的代码至少被触发 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
}
Run Code Online (Sandbox Code Playgroud)