如何在C#中每当WindowState更改时触发某些操作?

18

所以我想在程序的这个部分实现速度时,当我的主窗体的窗口状态改变时立即触发一个函数。我需要它像这样:

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

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

由于表单会经常调整大小,所以检查大小是否发生改变并不起作用。


表单为什么会经常调整大小,如果存在'if (WindowState == x)'与响应WindowStateChanged事件相比,性能损失会有多大? - Mufaka
4个回答

27

非常感谢!有人知道如何在窗口浮动到屏幕一侧时触发事件吗?(点击标题并将窗口拖到屏幕侧面)大小更改肯定会触发,但是否有字段或其他信息可获取该信息? - Noel Widmer
@NoelWidmer 你可能需要使用Windows API调用来实现Win7+的功能。不过我手头上不确定它们是什么。 - Reed Copsey
1
@ReedCopsey,因为此操作只是改变窗口的位置和大小,所以我必须在每次调整大小时检查窗口的位置和大小。我正在捕获窗口消息并使用MINMAXINFO获取客户端工作区域。现在它已经运行正常,但还是谢谢您! - Noel Widmer
当窗口的大小实际上没有改变时,从正常状态到最大化或反之亦然时,这种方法不起作用。这种情况可能不常见,但并非不可能。 - Walt D

12

我希望我来派对的时间不算太晚。

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

    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
    }

底线 - 它有效。


这个比选定的答案好得多,因为它捕捉到了状态的变化,而不是假设状态的变化或者通过多余的追踪和逻辑来确保假设的正确性。 - undefined

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

希望这可以帮助您!


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
}
}

这对于设置WindowState属性非常有用,但我认为问题是如何捕获它更改后触发的事件。 - funseiki
对不起@funseiki。我收到了你的问题。我会尽快找到答案。 - Krishna Thota

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接