2010-12-10 13 views
7

Wie nehme ich ein Formular, das derzeit minimiert ist, und es in seinen vorherigen Zustand wiederherstellen. Ich kann keinen Weg finden zu bestimmen, ob der vorherige WindowStateNormal oder Maximized war; aber ich weiß, dass die Informationen irgendwo gespeichert werden müssen, weil Windows kein Problem mit Apps in der Taskleiste hat.C# programmgesteuert Formular nicht minimieren

Antwort

8

Es gibt keine verwaltete API dafür. Der Weg dazu ist PInvoke GetWindowPlacement und überprüfen Sie für WPF_RESTORETOMAXIMIZED.

Für Details siehe Microsoft How To (die die Technik in VB demonstriert).

In C#, wäre dies:

[DllImport("user32.dll", SetLastError = true)] 
[return: MarshalAs(UnmanagedType.Bool)] 
private static extern bool GetWindowPlacement(IntPtr hWnd, ref WINDOWPLACEMENT lpwndpl); 


private struct WINDOWPLACEMENT 
{ 
    public int length; 
    public int flags; 
    public int showCmd; 
    public System.Drawing.Point ptMinPosition; 
    public System.Drawing.Point ptMaxPosition; 
    public System.Drawing.Rectangle rcNormalPosition; 
} 

public void RestoreFromMinimzied(Form form) 
{ 
    const int WPF_RESTORETOMAXIMIZED = 0x2; 
    WINDOWPLACEMENT placement = new WINDOWPLACEMENT(); 
    placement.length = Marshal.SizeOf(placement); 
    GetWindowPlacement(form.Handle, ref placement); 

    if ((placement.flags & WPF_RESTORETOMAXIMIZED) == WPF_RESTORETOMAXIMIZED) 
     form.WindowState = FormWindowState.Maximized; 
    else 
     form.WindowState = FormWindowState.Normal; 
} 
+0

@Dan: Danke - Ich reparierte die Fehler - (Ich tippte im laufenden Betrieb und kopierte von pinvoke.net, was das Ref/Out-Problem falsch hatte ...) –

+1

@Dan: Klingt so, dass es für dich funktioniert hat , mindestens ;) –

7
this.WindowState = FormWindowState.Normal; 

Sie haben auch:

this.WindowState = FormWindowState.Minimized; 
this.WindowState = FormWindowState.Maximized; 

Ah, ich habe die Frage falsch verstanden:

Restore WindowState from Minimized sollte das sein, was Sie suchen. Es sagt, dass Sie in der Taskleiste Verhalten wie dies nachahmen kann:

SendMessage(form.Handle, WM_SYSCOMMAND, SC_RESTORE, 0); 
+2

Das ist nicht seine Frage nicht beantworten - er fragt, ob sie normal gehen oder maximiert, wenn das Formular zur Zeit minimiert wird ... –

+0

ich meine Antwort aktualisiert. Ich habe die Frage missverstanden. –

+0

Dies ist eine viel sauberere Lösung - sehr einfach zu implementieren. –

1

Wenn Sie den vorherigen Zustand speichern möchten, wann immer es eine Änderung ist (maximieren/minimieren), werden Sie in die SizeChanged Ereignis Haken haben, nach this post on MSDN . Sie können die WindowState dort bekommen und speichern.

+1

Es gibt eine bessere Möglichkeit, als dies selbst zu speichern. Es ist bereits von der Windows-API erfasst. –

3

Sie können die Fenster Zustandsänderungen durch das Ereignis Resize verfolgen. Wie folgt aus:

public partial class Form1 : Form { 
    public Form1() { 
     InitializeComponent(); 
     prevState = currState = this.WindowState; 
    } 
    protected override void OnResize(EventArgs e) { 
     if (currState != this.WindowState) { 
      prevState = currState; 
      currState = this.WindowState; 
     } 
     base.OnResize(e); 
    } 
    private FormWindowState prevState, currState; 
} 
Verwandte Themen