2010-12-10 22 views
7

Comment puis-je prendre un formulaire qui est actuellement réduit et le restaurer à son état précédent. Je ne peux pas trouver un moyen de déterminer si son précédent WindowState était Normal ou Maximized; mais je sais que l'information doit être stockée quelque part parce que Windows n'a pas de problème avec les applications sur la barre des tâches.C# Programmatically Unminimize form

Répondre

8

Il n'y a pas d'API managée pour cela. La façon de le faire est de PInvoke GetWindowPlacement et vérifier WPF_RESTORETOMAXIMIZED.

Pour plus de détails, voir ce Microsoft How To (qui illustre la technique dans VB).

En C#, ce serait:

[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: Merci - J'ai corrigé les erreurs - (Je tapais à la volée, et copiez à partir de pinvoke.net, qui avait le problème ref/out faux ...) –

+1

@Dan: Cela a fonctionné pour vous, bien que , au moins ;) –

7
this.WindowState = FormWindowState.Normal; 

Vous avez aussi:

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

Ah, j'ai mal compris la question:

Restore WindowState from Minimized devrait être ce que vous cherchez. Il dit que vous pouvez imiter le comportement de la barre des tâches comme ceci:

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

Cela ne répond pas à sa question - il demande si vous voulez aller à la normale ou maximisé si la forme est actuellement réduite au minimum ... –

+0

Je mis à jour ma réponse. J'ai mal compris la question. –

+0

Ceci est une solution beaucoup plus propre - très simple à mettre en œuvre. –

1

Si vous voulez stocker l'état précédent à chaque fois qu'il ya un changement (maximiser/minimiser), vous devrez brancher dans l'événement SizeChanged, selon this post on MSDN . Vous pouvez y obtenir le WindowState et l'enregistrer.

+1

Il y a une meilleure option que de stocker vous-même. Il est déjà suivi par l'API Windows. –

3

Vous pouvez suivre les changements d'état de la fenêtre par l'événement Resize. Comme ceci:

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