15

したがって、プログラムのこの部分は速度に依存しているため、メイン フォームで windowstate が変更されたときに関数を即座にトリガーしたいと考えています。私はそれが次のようなものである必要があります:

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

フォームのイベント タブを確認しましたが、WindowStateChanged などはありません。どうすればよいですか?

フォームは頻繁にサイズ変更されるため、サイズ変更のタイミングを確認することはできません。

4

4 に答える 4

25

WindowState が変化すると、Resizeイベント (またはSizeChanged ) が発生します。


ちなみに、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 に答える