【问题标题】:How do I trigger something whenever the WindowState changes in C#?每当 C# 中的 WindowState 更改时,如何触发某些内容?
【发布时间】:2012-09-04 01:34:13
【问题描述】:

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

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

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

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

【问题讨论】:

  • 为什么表单的大小会调整很多?如果(WindowState == x)与响应 WindowStateChanged 事件(如果存在)相关,性能会受到什么影响?跨度>

标签: c# windowstate


【解决方案1】:

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


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

【讨论】:

  • 非常感谢!有谁知道当窗口浮动到屏幕的一侧时触发事件的方法? (单击标题并将窗口拖动到屏幕一侧)更改的大小肯定会触发,但是是否有字段或其他内容可以获取该信息?
  • @NoelWidmer 您可能需要使用 windows API 调用来实现 win7+ 功能。不过,不确定他们会是什么。
  • @ReedCopsey 因为这实际上只是改变了窗口的位置和大小,所以我必须在每次调整大小时检查窗口的位置和大小。我正在捕捉窗口消息并使用 MINMAXINFO 来获取客户端工作区。它现在可以工作了,但还是谢谢!
  • 这在从正常->最大化时不起作用,反之亦然,当窗口大小实际上没有改变时。也许不常见,但并非不可能。
【解决方案2】:

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

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

底线 - 它有效。

【讨论】:

    【解决方案3】:

    您可以尝试按照this link 的建议覆盖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 事件并从那里检查窗口状态。但我听说当控件(或表单?)最大化时它不会触发。

    希望这会有所帮助!

    【讨论】:

      【解决方案4】:

      您可以使用它从另一个线程更改窗体的窗口状态。这适用于 .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。我收到了你的问题。我很快就会找到答案。
      猜你喜欢
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      • 2020-09-08
      • 1970-01-01
      • 2015-11-02
      • 2022-01-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多