2011-01-04 6 views
8

C#/ .NETでウィンドウが復元されたときに発生するイベントはありますか?ウィンドウが復元されたときにC#でイベントが発生しましたか?

ウィンドウがアクティブになったときに発生するイベントがありますが、最大化または最小化された状態など、復元されているウィンドウに対して対応するイベントが見つかりません。

+0

「復元する」とはどういう意味ですか? – AlexCode

+0

SizeChangedイベントを試しましたか? http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.sizechanged.aspx – Jon

+1

復元すると、アプリケーションが(最小化状態から来た)タスクバーから再起動されたことを意味しますか? –

答えて

2

かなりわかりません。 SizeChangedイベントを処理し、がMinimizedからNormalまたはMaximizedからNormalに変更されたかどうかを検出する必要があります。 Source

+0

復元されると、最大化から通常化に進むこともできます。 – BobC

+0

ああ、もちろん;) –

2

あなたはこのようにそれを確認することができます:あなたはあなたができる、フォームのWindowStateプロパティを使用して好きではないと、フォームの前の状態を示すフラグの周りに保つためにしたくない場合は

private void Form1_Resize(object sender, EventArgs e) 
{ 
    if (this.WindowState == FormWindowState.Minimized) 
    { 
     ... 
    } 
    else if .... 
    { 
    } 
} 
+0

'Resize'イベントの' if(this.WindowState == FormWindowState.Maximized){...} 'があなたが探しているものです。 –

+4

状態が*変更*されているかどうかは実際にはわかりませんが、サイズ変更時にはその状態だけが表示されます。 –

13

わずかに低いレベルで同じ結果を達成します。

フォームのウィンドウプロシージャ(WndProc)を無効にしてWM_SYSCOMMAND messageSC_RESTORE)を聞く必要があります。

protected override void WndProc(ref Message m) 
{ 
    const int WM_SYSCOMMAND = 0x0112; 
    const int SC_RESTORE = 0xF120; 

    if (m.Msg == WM_SYSCOMMAND && (int)m.WParam == SC_RESTORE) 
    { 
     // Do whatever processing you need here, or raise an event 
     // ... 
     MessageBox.Show("Window was restored"); 
    } 

    base.WndProc(ref m); 
} 
+0

このようにして将来のWindows版では動作しなくなり、MonoやCEで動作しなくなることを覚えておいてください。 –

+0

@ SoMoS:将来のWindows版では動作しなくなるとは考えられません。ウィンドウングフレームワーク全体が書き換えられない限り、これは正常に動作します。そして起こった場合、これ以上の互換性の問題があります。 .NET Framework P /とにかくこのようなものの大部分を呼び出します。それはWindows CE上で正常に動作するはずです。私はモノについてはわかりませんが、この質問はそのようなサポートの必要性を示していませんでした。 –

+1

私はちょうどあなたが避けることができるので、あなたが依存することを追加しているので、低すぎることは.Netの哲学に対して少しです。また、Linux(とMono)がPInvokeをサポートしていないことを確認することができます(またCEには完全なサポートはありません)。 –

0

チェック:例えば

private void Form1_Activated(Object o, EventArgs e) 
{ 
    if (this.WindowState == FormWindowState.Minimized) { 
     ... 
    } 
} 
+0

これは良いアプローチです。これは 'Minimized'状態から復元するときに機能しますが、' Maximized'時には機能しません。 – Neolisk

+0

他の誰かがこれを突き抜けた場合に備えて、最大化を処理するDeactivateメソッドがあります。 – rbuddicom

-2

これは、追加するのは簡単です:

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 
    } 

は、このリンク winforms-windowstate-changed-how-to-detect-this?

1

に行く私はこの質問はかなり古いです知っているが、この方法で動作します:

public Form1() 
{ 
    InitializeComponent(); 
    this.SizeChanged += new EventHandler(Form1_WindowStateTrigger); 
} 

private void Form1_WindowStateTrigger(object sender, EventArgs e) 
{ 
    if (this.WindowState == FormWindowState.Minimized) 
    { 
     MessageBox.Show("FORM1 MINIMIZED!"); 
    } 

    if (this.WindowState == FormWindowState.Normal) 
    { 
     MessageBox.Show("FORM1 RESTORED!"); 
    } 

    if (this.WindowState == FormWindowState.Maximized) 
    { 
     MessageBox.Show("FORM1 MAXIMIZED!"); 
    } 
} 

SizeChangedイベントを使用して、WindowStateのチェックと組み合わせてここでトリックを行います。

+0

あなたは単純なサイズ変更のヒアを考慮しません!したがって、最後の状態をどこかに保存して、usr-local-ΕΨΗΕΛΩΝが提供するように評価する必要があります。 – Rekshino

0

Redhartからの回答が良いです。これは同じですが少しシンプルです:

public Form1() 
{ 
    InitializeComponent(); 
    this.SizeChanged += Form1_SizeChanged; 
} 

#region Event-Handlers 
void Form1_SizeChanged(object sender, EventArgs e) 
{ 
    var state = this.WindowState; 
    switch (state) 
    { 
     case FormWindowState.Maximized: 
      ClearMyView(); 
      DisplayMyStuff(); 
      break; 
     case FormWindowState.Minimized: 
      break; 
     case FormWindowState.Normal: 
      ClearMyView(); 
      DisplayMyStuff(); 
      break; 
     default: 
      break; 
    } 
} 
#endregion Event-Handlers 
関連する問題