2010-12-10 10 views
7

Jak wziąć formularz, który jest obecnie zminimalizowany i przywrócić go do poprzedniego stanu. Nie mogę znaleźć żadnego sposobu, aby ustalić, czy jego poprzednia wersja była WindowState została Normal lub Maximized; ale wiem, że informacje muszą być przechowywane gdzieś, ponieważ Windows nie ma problemu z robieniem tego z aplikacjami na pasku zadań.C# Programowo Unminimize form

Odpowiedz

8

Nie ma zarządzanego API dla tego. Aby to zrobić, należy PInvoke GetWindowPlacement i sprawdzić pod kątem WPF_RESTORETOMAXIMIZED.

Aby uzyskać szczegółowe informacje, patrz: Microsoft How To (który demonstruje technikę w VB).

w C#, byłoby to:

[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: Dzięki - Naprawiłem błędy - (pisałam w locie, a kopiowanie z pinvoke.net, które miało problem z ref/out) ... –

+1

@Dan: Brzmi jak to zadziałało dla ciebie, chociaż , przynajmniej ;) –

7
this.WindowState = FormWindowState.Normal; 

Trzeba również:

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

Ach, źle na pytanie:

Restore WindowState from Minimized powinno być to, czego szukasz. Mówi można naśladować zachowanie paska zadań takiego:

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

To nie jest odpowiedź na jego pytanie - on pyta, czy iść na Normal lub Zmaksymalizowana jeśli formularz jest aktualnie zminimalizowana ... –

+0

zaktualizowałem moją odpowiedź. Źle zrozumiałem pytanie. –

+0

To jest znacznie czystsze rozwiązanie - bardzo proste w realizacji. –

1

Jeśli chcesz zapisać stan poprzedni, gdy istnieje zmiana (maksymalizacji/minimalizacji), będziesz musiał zahaczyć w przypadku SizeChanged według this post on MSDN . Możesz pobrać tam WindowState i zapisać go.

+1

Jest lepsza opcja niż przechowywanie tego samodzielnie. Jest już śledzony przez interfejs API systemu Windows. –

3

można śledzić zmiany stanu okno w czasie zdarzenia Resize. Tak:

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; 
}