2010-12-10 15 views
7

¿Cómo tomo un formulario que actualmente está minimizado y lo restauro a su estado anterior? No puedo encontrar ninguna manera de determinar si su WindowState anterior era o Maximized; pero sé que la información debe almacenarse en alguna parte porque Windows no tiene problemas para hacerlo con aplicaciones en la barra de tareas.C# Programming Unminimize form

Respuesta

8

No hay una API administrada para esto. La forma de hacerlo es llamar a Invoke GetWindowPlacement y verificar WPF_RESTORETOMAXIMIZED.

Para obtener más información, consulte este Microsoft How To (que muestra la técnica en VB).

En C#, esto sería:

[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: gracias - Solucioné los errores - (estaba escribiendo sobre la marcha, y copiando desde pinvoke.net, que tenía el problema de ref/out incorrecto ...) –

+1

@Dan: aunque suena como que esto funcionó para ti , al menos ;) –

7
this.WindowState = FormWindowState.Normal; 

También tienen:

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

Ah, no he entendido bien la pregunta:

Restore WindowState from Minimized debe ser lo que estás buscando. Se dice que se puede imitar el comportamiento barra de tareas de la siguiente manera:

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

eso no responde a su pregunta - que está pidiendo ya sea para ir a Normal o maximizado si la forma se minimiza la actualidad ... –

+0

He actualizado mi respuesta. Yo malentendí la pregunta. –

+0

Esta es una solución mucho más limpia, muy simple de implementar. –

1

Si desea almacenar el estado anterior cada vez que hay un cambio (maximizar/minimizar), usted tiene que enganchar en el caso SizeChanged, según this post on MSDN . Puede obtener el WindowState allí y almacenarlo.

+1

Hay una mejor opción que almacenar esto usted mismo. Ya ha sido rastreado por la API de Windows. –

3

Puede realizar un seguimiento de los cambios de estado de la ventana a través del evento de cambio de tamaño. De esta manera:

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