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
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;
}
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);
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 ... –
Je mis à jour ma réponse. J'ai mal compris la question. –
Ceci est une solution beaucoup plus propre - très simple à mettre en œuvre. –
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.
Il y a une meilleure option que de stocker vous-même. Il est déjà suivi par l'API Windows. –
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;
}
@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 ...) –
@Dan: Cela a fonctionné pour vous, bien que , au moins ;) –