Подтвердить что ты не робот

Как я могу запускать что-либо, когда WindowState изменяется на С#?

Итак, я хочу немедленно, так как эта часть программы зависит от скорости, запускает функцию, когда windowstate изменяется в моей основной форме. Мне нужно, чтобы это было что-то вроде этого:

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

Я проверил вкладку событий формы, у меня нет WindowStateChanged и т.д. Как мне это сделать?

Форма будет сильно изменена, поэтому проверка, когда изменения размера не будут работать.

4b9b3361

Ответ 1

Resize событие (или SizeChanged) будет срабатывать при изменении WindowState.


На стороне примечание WPF действительно включает событие StateChanged для этого непосредственно.

Ответ 2

Надеюсь, я не опоздал на вечеринку.

Способ, которым я решил реализовать его, довольно прямолинейный и не требует выделения глобальных переменных, просто проверьте значение формы 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
    }

Нижняя строка - это работает.

Ответ 3

Вы можете попробовать переопределить функцию 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
}
}