Wiederherstellen von Window Minimized

stimmen
26

Gibt es eine einfache Methode, eine minimierte Form in seinen vorherigen Zustand, entweder normal oder maximierte wiederherzustellen? Ich erwarte die gleiche Funktionalität wie die Task-Leiste klicken (oder mit der rechten Maustaste und wählen wiederherstellen).

Bisher habe ich das, aber wenn das Formular zuvor maximiert wurde, kommt es nach wie vor zurück, als ein normales Fenster.

if (docView.WindowState == FormWindowState.Minimized)
    docView.WindowState = FormWindowState.Normal;

Muss ich die Zustandsänderung in Form behandeln den vorherigen Zustand zu erinnern?

Veröffentlicht am 09/12/2008 um 23:16
quelle vom benutzer
In anderen Sprachen...                            


6 antworten

stimmen
32

Ich benutze die folgende Erweiterungsmethode:

using System.Runtime.InteropServices;

namespace System.Windows.Forms
{
    public static class Extensions
    {
        [DllImport( "user32.dll" )]
        private static extern int ShowWindow( IntPtr hWnd, uint Msg );

        private const uint SW_RESTORE = 0x09;

        public static void Restore( this Form form )
        {
            if (form.WindowState == FormWindowState.Minimized)
            {
                ShowWindow(form.Handle, SW_RESTORE);
            }
        }
    }
}

Dann rufen Sie form.Restore()in meinem Code.

Beantwortet am 27/04/2010 um 22:20
quelle vom benutzer

stimmen
11

Der einfachste Weg, um eine Form wiederherstellen in dem Normalzustand ist:

if (MyForm.WindowState == FormWindowState.Minimized)
{
    MyForm.WindowState = FormWindowState.Normal;
}
Beantwortet am 24/02/2015 um 13:26
quelle vom benutzer

stimmen
4

Sie könnten simulieren in der Taskleiste Schaltfläche wie folgt klicken:

SendMessage(docView.Handle, WM_SYSCOMMAND, SC_RESTORE, 0);
Beantwortet am 09/12/2008 um 23:31
quelle vom benutzer

stimmen
3

Für mich wird der Code oben nicht funktionieren.

Aber schließlich fand ich den Arbeitscode. Hier ist es:

CxImports.ManagedWindowPlacement placement = new CxImports.ManagedWindowPlacement();
CxImports.GetWindowPlacement(Convert.ToUInt32(Handle.ToInt64()), placement);

if (placement.flags == CxImports.WPF_RESTORETOMAXIMIZED)
    WindowState = FormWindowState.Maximized;
else
    WindowState = FormWindowState.Normal;

Ich denke, Sie können alle benötigten „importiert“ Funktionen durch einfaches Googeln finden.

Beantwortet am 09/09/2009 um 11:55
quelle vom benutzer

stimmen
1

Wenn jemand fragt, wie das mit anderen Anwendungen Fenstern zu tun, funktioniert dieser Code für mich:

    public void UnMinimize(IntPtr handle)
    {
        WINDOWPLACEMENT WinPlacement = new WINDOWPLACEMENT();
        GetWindowPlacement(handle, out WinPlacement);
        if(WinPlacement.flags.HasFlag(WINDOWPLACEMENT.Flags.WPF_RESTORETOMAXIMIZED))
        {
            ShowWindow(handle, (int)SW_MAXIMIZE);
        }
        else
        {
            ShowWindow(handle, (int)SW_RESTORE);
        }
    }

Stuff ist hier:

[StructLayout(LayoutKind.Sequential)]
public struct RECT
{
    public Int32 Left;
    public Int32 Top;
    public Int32 Right;
    public Int32 Bottom;
}

public struct POINT
{
    public int x;
    public int y;
}

public struct WINDOWPLACEMENT
{

    [Flags]
    public enum Flags : uint
    {
        WPF_ASYNCWINDOWPLACEMENT = 0x0004,
        WPF_RESTORETOMAXIMIZED = 0x0002,
        WPF_SETMINPOSITION = 0x0001
    }


    /// <summary>
    /// The length of the structure, in bytes. Before calling the GetWindowPlacement or SetWindowPlacement functions, set this member to sizeof(WINDOWPLACEMENT).
    /// </summary>
    public uint length;
    /// <summary>
    /// The flags that control the position of the minimized window and the method by which the window is restored. This member can be one or more of the following values.
    /// </summary>
    /// 
    public Flags flags;//uint flags;
                       /// <summary>
                       /// The current show state of the window. This member can be one of the following values.
                       /// </summary>
    public uint showCmd;
    /// <summary>
    /// The coordinates of the window's upper-left corner when the window is minimized.
    /// </summary>
    public POINT ptMinPosition;
    /// <summary>
    /// The coordinates of the window's upper-left corner when the window is maximized.
    /// </summary>
    public POINT ptMaxPosition;
    /// <summary>
    /// The window's coordinates when the window is in the restored position.
    /// </summary>
    public RECT rcNormalPosition;
}

public class UnMinimizeClass
{
    [DllImport("user32.dll")]
    public static extern bool GetWindowPlacement(IntPtr hWnd, out WINDOWPLACEMENT lpwndpl);

    [DllImport("user32.dll")]
    public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

    const int SW_MAXIMIZE = 3;
    const int SW_RESTORE = 9;

    public static void UnMinimize(IntPtr handle)
    {
        WINDOWPLACEMENT WinPlacement = new WINDOWPLACEMENT();
        GetWindowPlacement(handle, out WinPlacement);
        if (WinPlacement.flags.HasFlag(WINDOWPLACEMENT.Flags.WPF_RESTORETOMAXIMIZED))
        {
            ShowWindow(handle, SW_MAXIMIZE);
        }
        else
        {
            ShowWindow(handle, (int)SW_RESTORE);
        }
    }
}
Beantwortet am 07/07/2018 um 00:35
quelle vom benutzer

stimmen
-1

Der obige Code nicht ganz für mich arbeiten in allen Situationen

Nachdem die Fahnen Überprüfung muss ich auch ShowCmd = 3 überprüfen und wenn ja maximieren sonst wiederherstellen

Beantwortet am 15/09/2016 um 09:04
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more