2012-05-04 22 views
3

の後にと呼ばれるフォームからイベントを探しています。ウィンドウが最大化または最小化されました。ウィンドウが最大化された後に呼び出されるイベント

最大サイズのウィンドウを処理できるSizeChangedやWndProcなどのイベントがありますが、ユーザーがウィンドウを最大化しようとした直後に呼び出され、ウィンドウが完全に最大化された後では呼び出されません。

私はResizeEndのようなイベントを探していますが、多分これが呼び出されるMaximizedEndまたはMinimizedEnd

はそれを行うためにとにかくはありますか?

+1

あなたはSizeChangedを購読することができますし、リスナの中にはWindowStateがMaximizedに設定されるまで待つスレッド(PInvoke )、ResizeEndメソッドを呼び出します。 – SimpleVar

答えて

1

これはGabrielのソリューションの詳細を示しています。私はWindoStateChangedのイベントがあるとは思わない。

このソリューションをテストしたところ、最大化ボタンをクリックすると機能しています。それは3回も解雇されているようだ。おそらく少しデバッグを行い、状態が変更されたかどうかを確認するためにm.Msgを傍受したいことを正確に把握します。これらのWM_メッセージのいくつかのクイックリファレンスがここにあります。http://www.autohotkey.com/docs/misc/SendMessageList.htm

protected override void WndProc(ref Message m) 
    { 
     FormWindowState previousWindowState = this.WindowState; 

     base.WndProc(ref m); 

     FormWindowState currentWindowState = this.WindowState; 

     if (previousWindowState != currentWindowState && currentWindowState == FormWindowState.Maximized) 
     { 
      // TODO: Do something the window has been maximized 

     } 
    } 

上記のコードは、少なくとも私がテストしている間は3回発砲します。以下のコードは一度だけ起動します。もう少し時間がかかりますが、より直感的になり、イベントを発生させる方法についてのあなたの質問にもっと完全に対処するかもしれません。このアイデアのためのあなたの質問への彼のコメントのためにYoreに感謝します。

protected override void OnSizeChanged(EventArgs e) { 
    if (this.WindowState == FormWindowState.Maximized) { 
    MessageBox.Show("Max!"); 
    } 
    base.OnSizeChanged(e); 
} 

ないあなたは、ウィンドウがサイズである後によって何を意味するかを確認します。

public Form1() 
{ 
    InitializeComponent(); 

    this.SizeChanged +=new EventHandler(Form1_SizeChanged); 
    FormMaximized += new EventHandler(Form1_FormMaximized); 

    _CurrentWindowState = this.WindowState; 
    if (_CurrentWindowState == FormWindowState.Maximized) 
    { 
     FireFormMaximized(); 
    } 
} 

public event EventHandler FormMaximized; 
private void FireFormMaximized() 
{ 
    if (FormMaximized != null) 
    { 
     FormMaximized(this, EventArgs.Empty); 
    } 
} 

private FormWindowState _CurrentWindowState; 
private void Form1_SizeChanged(object sender, EventArgs e) 
{ 
    if (this.WindowState == FormWindowState.Maximized && _CurrentWindowState != FormWindowState.Maximized) 
    { 
     FireFormMaximized(); 
    } 
    _CurrentWindowState = this.WindowState; 
} 

void Form1_FormMaximized(object sender, EventArgs e) 
{ 
    //TODO Put you're code here 
} 
+0

おお、あなたが本当に欲しかったことは、あなたのイベントを行い、TODO: –

0

これはあなたが探している答えではないかもしれませんが、ウィンドウが最大化された後に呼び出されるWindowsフォームのイベントは定義されていません。見つかるイベントがある場合は、自分でメッセージループに入る必要があります。一般に、ユーザーがウィンドウを最大化してもサイズの変更が気にならないかどうかを知りたければ、windowstateを保存し、SizedChangedに変更するとウィンドウが最大化されたと言えるでしょう。

6

私はそれがこのような単純なことだと思います。これは、あまりにも、うまくいくかもしれない:

protected override void OnSizeChanged(EventArgs e) { 
    if (this.WindowState == FormWindowState.Maximized) { 
    this.BeginInvoke(new MethodInvoker(delegate { MessageBox.Show("Maxed"); })); 
    } 
    base.OnSizeChanged(e); 
} 

は、あなたのコードでMessageBox.Show(...)を交換してください。

+1

こんにちはLarsTech、最初の解決策は私のために働いた。ありがとう – grmbl

0

私はwndProcを無効にしてWM_SYSCOMMANDイベントを発生させるべきだと思います。

protected override void WndProc(ref Message m) 
    { 
     if ((UInt32)m.Msg == Constant.WM_SYSCOMMAND) 
     { 
      switch ((UInt32)m.WParam) 
      { 
       case Constant.SC_MAXIMIZE: 

       case Constant.SC_RESTORE: 

       default: 
        break; 
      } 
     } 
     base.WndProc(ref m); 
    } 
+0

SysCommandsはウィンドウの最大化をトリガーします。ハンドラをスイッチに入れると、処理が早すぎます。 base.WndProcの呼び出し後にWM_SYSCOMMANDをチェックすると、より良いことがありますが、この時点で最大化が完了したことを確認することはできません。最初のハンドラはいくつかのフォローアップメッセージをメッセージキューにPOSTすることができます。 – Rolf

2

resize、resizeBegin、およびresizeEndイベントを使用すると、winformのサイズを変更した後で何かを行うのに適しています。

private bool resize_flag = true; 
    private void Form1_Resize(object sender, EventArgs e) 
    { 
     if (!resize_flag) return; 
     //your code here 
     resize_flag = true; 
    } 

    private void Form1_ResizeBegin(object sender, EventArgs e) 
    { 
     resize_flag = false; 
    } 

    private void Form1_ResizeEnd(object sender, EventArgs e) 
    { 
     //your code here 
     resize_flag = true; 
    } 

このコードはシンプルですが機能します。 resizeEndはマウスドラッグでサイズ変更を行い、resizeは最大化や復元などのwindowStateを変更するためのものです。私はWndProc()をオーバーライドするのは良いと思うけど、winformがサイズ変更される前に解雇されていると思います...

関連する問題