2011-01-04 7 views
8

Gibt es ein Ereignis, das ausgelöst wird, wenn ein Fenster in C# /. NET wiederhergestellt wird?Wird ein Ereignis in C# ausgelöst, wenn ein Fenster wiederhergestellt wird?

Ich habe festgestellt, dass ein Ereignis ausgelöst wird, wenn ein Fenster aktiviert wird, aber ich kann kein entsprechendes Ereignis für ein Fenster finden, das wiederhergestellt wird, z. B. von einem maximierten oder minimierten Zustand.

+0

Was meinst du mit "Wiederherstellen"? – AlexCode

+0

Haben Sie versucht, das SizeChanged-Ereignis zu verwenden? http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.sizecu.aspx – Jon

+1

durch Wiederherstellen, meinen Sie, wenn die App reaktiviert wurde (kam aus minimiertem Zustand) von Taskleiste? –

Antwort

2

Ziemlich unsicher. Sie müssen das Ereignis SizeChanged behandeln und feststellen, ob WindowState von Minimized zu Normal oder Maximized zu Normal geändert wurde. Source

+0

Wiederhergestellt kann auch bedeuten, von maximiert zu normal zu gehen. – BobC

+0

Oh, natürlich;) –

2

Sie können es auf diese Weise überprüfen:

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

Suche nach 'if (this.WindowState == FormWindowState.Maximized) {...}' in dem 'Resize' Ereignis ist, was Sie suchen. –

+4

Das wird Ihnen nicht sagen, ob der Status * geändert * wurde, nur was zum Zeitpunkt der Größenänderung ist. –

13

Wenn Sie nicht wie die WindowState Eigenschaft des Formulars verwenden und nicht um eine Flagge zu halten zu haben, den vorherigen Zustand des Formulars anzeigt, können Sie erreichen das gleiche Ergebnis auf einem etwas niedrigeren Niveau.

Sie müssen die Fensterprozedur Ihres Formulars überschreiben (WndProc) und auf eine WM_SYSCOMMAND message mit der Angabe SC_RESTORE warten. Zum Beispiel:

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

Denken Sie daran, dass auf diese Weise könnte aufhören zu arbeiten auf zukünftige Windows-Versionen und natürlich nicht auf Mono und vielleicht CE arbeiten –

+0

@SoMoS: Es gibt absolut keinen Grund zu glauben, dass dies würde aufhören zu arbeiten auf eine zukünftige Windows-Version. Wenn das gesamte Fensterframework nicht neu geschrieben wird, funktioniert das problemlos. Und falls das passiert, werden Sie viel mehr Kompatibilitätsprobleme haben als dies. Das .NET Framework P/Invoziert die meisten dieser Sachen sowieso unter die Decke. Es sollte auf Windows CE gut funktionieren; Ich weiß nichts über Mono, aber die Frage hat keine Notwendigkeit für eine solche Unterstützung angezeigt. –

+1

Ich wollte nur darauf hinweisen, dass ein so niedriger Wert etwas gegen die .Net-Philosophie ist, weil Sie eine Abhängigkeit über die SO hinzufügen, die Sie vermeiden könnten.Und Sie können sicher sein, dass Linux (und Mono) kein PInvoke unterstützt (und CE hat keine vollständige Unterstützung). –

0

Check:

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

Dies ist ein guter Ansatz - es funktioniert beim Wiederherstellen von einem "minimized" Zustand, funktioniert aber nicht, wenn es "maximiert" wurde. – Neolisk

+0

Es gibt eine Deactivate-Methode, um die Maximierung auch zu handhaben, falls jemand darüber stolpert. – rbuddicom

-2

Es ist leicht genug, hinzuzufügen:

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 
    } 

zu diesem Link gehen winforms-windowstate-changed-how-to-detect-this?

1

Ich weiß, diese Frage ist ziemlich alt, aber es funktioniert so:

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!"); 
    } 
} 

Die Verwendung des SizeChanged-Ereignisses, gekoppelt mit einer Überprüfung von WindowState, macht hier den Trick.

+0

Sie betrachten die einfache Größe hier nicht! Sie müssen also den letzten Zustand irgendwo speichern und ihn als usr-local-ΕΨΗΕΛΩΝ auswerten! – Rekshino

0

Die Antwort von Redhart ist gut. Dies ist das gleiche, aber etwas einfacher:

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 
Verwandte Themen