每当WindowState在C#中发生变化时,如何触发某些内容?

时间:2012-09-04 01:34:14

标签: c# windowstate

所以我想立即,因为程序的这部分依赖于速度,在我的主窗体中更改windowstate时触发一个函数。我需要它是这样的:

private void goButton_Click(object sender, EventArgs e)
{
   //Code
}

我查看了表单的事件选项卡,我没有WindowStateChanged等。我该怎么做?

表单将大量调整大小,因此检查大小更改的时间将不起作用。

4 个答案:

答案 0 :(得分:21)

当WindowState发生变化时,Resize事件(或SizeChanged)将会触发。


在旁注中,WPF确实直接包含StateChanged事件。

答案 1 :(得分:3)

我希望我的聚会不会太晚。

我选择实现它的方式很简单,并且不需要分配全局变量,只需在调用WindowState之前和之后检查表单的base.WndProc值:

    protected override void WndProc(ref Message m)
    {
        FormWindowState org = this.WindowState;
        base.WndProc(ref m);
        if (this.WindowState != org)
            this.OnFormWindowStateChanged(EventArgs.Empty);
    }

    protected virtual void OnFormWindowStateChanged(EventArgs e)
    {
        // Do your stuff
    }

底线 - 它有效。

答案 2 :(得分:1)

您可以尝试将WndProc函数覆盖为this link建议。

来自帖子:

protected override void WndProc(ref Message m) 
{
    if (m.Msg == /*WM_SIZE*/ 0x0005)
    {
        if(this.WindowState == FormWindowState.Minimized) 
        {
            // do something here
        }
    }

    base.WndProc(ref m);
}

此代码只检查触发Resize事件时的表单状态。

或者,您可能只是抓住表单的Resize事件并从那里检查窗口状态。但我听说当控件(或Form?)最大化时它不会触发。

希望这有帮助!

答案 3 :(得分:0)

您可以使用此方法从另一个线程更改窗体的窗口状态。这适用于.Net Framework 3.5

Invoke(new Action(() => { this.WindowState = FormWindowState.Normal; }));

我希望这对你有所帮助。

public partial class Form1 : Form {
private FormWindowState mLastState;
public Form1() {
  InitializeComponent();
  mLastState = this.WindowState;
}
protected override void OnClientSizeChanged(EventArgs e) {
  if (this.WindowState != mLastState) {
    mLastState = this.WindowState;
    OnWindowStateChanged(e);
  }
  base.OnClientSizeChanged(e);
}
protected void OnWindowStateChanged(EventArgs e) {
  // Do your stuff
}
}