15

所以我想立即,因为这部分程序依赖于速度,当我的主窗体中的窗口状态发生变化时触发一个函数。我需要它是这样的:

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

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

表单将调整很多大小,因此无法检查大小何时更改。

4

4 回答 4

25

Resize事件(或SizeChanged )将在 WindowState 更改时触发。


附带说明一下,WPF 确实为此直接包含一个StateChanged事件。

于 2012-09-04T01:39:51.467 回答
7

我希望我参加聚会不会太晚。

我选择实现它的方式非常简单,不需要分配全局变量,只需在调用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
    }

底线 - 它有效。

于 2015-07-23T07:34:45.240 回答
1

您可以尝试按照此链接的建议覆盖该WndProc功能。

从帖子:

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事件并从那里检查窗口状态。但是我听说当控件(或表单?)最大化时它不会触发。

希望这可以帮助!

于 2012-09-04T01:45:18.347 回答
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
}
}
于 2012-09-04T01:41:58.490 回答