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...                            


7 antworten

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

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
0
    [DllImport("user32.dll")] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool GetWindowRect(IntPtr hWnd, ref wndRect lpRect);
    [DllImport("user32.dll")] public static extern bool IsWindowVisible(IntPtr hWnd);
    [DllImport("user32.dll")] public static extern bool EnumWindows(WNDENUMPROC lpEnumFunc, int lParam);//用来遍历所有窗口 
    [DllImport("user32.dll")] public static extern int GetWindowTextW(IntPtr hWnd, [MarshalAs(UnmanagedType.LPWStr)]StringBuilder lpString, int nMaxCount);//获取窗口Text 
    [DllImport("user32.dll")] public static extern int GetClassNameW(IntPtr hWnd, [MarshalAs(UnmanagedType.LPWStr)]StringBuilder lpString, int nMaxCount);//获取窗口类名 

    public static List<wndInfo> GetAllDesktopWindows(bool? isVisitable_)
    {
        //用来保存窗口对象
        List<wndInfo> wndList = new List<wndInfo>();

        //enum all desktop windows 
        EnumWindows(delegate (IntPtr hWnd, int lParam)
        {
            wndInfo wnd = new wndInfo();
            StringBuilder sb = new StringBuilder(256);
            //get hwnd 
            wnd.hWnd = hWnd;
            if (isVisitable_ == null || IsWindowVisible(wnd.hWnd) == isVisitable_)
            {
                //get window name  
                GetWindowTextW(hWnd, sb, sb.Capacity);
                wnd.szWindowName = sb.ToString();

                //get window class 
                GetClassNameW(hWnd, sb, sb.Capacity);
                wnd.szClassName = sb.ToString();

                wndList.Add(wnd);
            }
            return true;

        }, 0);

        return wndList;
    }

    private void Btn_Test5_Click(object sender, RoutedEventArgs e)
    {
        var ws = WSys.GetAllDesktopWindows(true);
        foreach (var w in ws)
        {
            if (w.szWindowName == "计算器")
            {
                WSys.ShowWindow(w.hWnd, 5);
                WSys.ShowWindow(w.hWnd, 9);
                Log.WriteLine(w.szWindowName);
            }
        }
    }
Beantwortet am 27/09/2019 um 18:47
quelle vom benutzer

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