Επαναφορά WindowState από ελαχιστοποιημένο

ψήφοι
26

Υπάρχει ένας εύκολος τρόπος για να επαναφέρετε ένα ελαχιστοποιημένο μορφή στην προηγούμενη κατάσταση, είτε Κανονική ή Μεγιστοποίηση; Περιμένω την ίδια λειτουργικότητα με κλικ στη γραμμή εργασιών (ή δεξί κλικ και επιλέγοντας την αποκατάσταση).

Μέχρι στιγμής, δεν έχω αυτό, αλλά αν το έντυπο, στο παρελθόν ήταν μεγιστοποιείται, εξακολουθεί να επανέρχεται ως ένα κανονικό παράθυρο.

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

Έχω να χειριστεί την αλλαγή κατάστασης στη φόρμα για να θυμηθούμε την προηγούμενη κατάσταση;

Δημοσιεύθηκε 09/12/2008 στις 23:16
πηγή χρήστη
Σε άλλες γλώσσες...                            


7 απαντήσεις

ψήφοι
32

Μπορώ να χρησιμοποιήσω την ακόλουθη μέθοδο επέκτασης:

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

Στη συνέχεια, καλέστε form.Restore()τον κωδικό μου.

Απαντήθηκε 27/04/2010 στις 22:20
πηγή χρήστη

ψήφοι
11

Ο ευκολότερος τρόπος για να αποκατασταθεί μια φόρμα στην κανονική της κατάσταση είναι:

if (MyForm.WindowState == FormWindowState.Minimized)
{
    MyForm.WindowState = FormWindowState.Normal;
}
Απαντήθηκε 24/02/2015 στις 13:26
πηγή χρήστη

ψήφοι
4

Θα μπορούσατε να προσομοιώσουν κάνοντας κλικ στο κουμπί της γραμμής εργασιών, όπως αυτό:

SendMessage(docView.Handle, WM_SYSCOMMAND, SC_RESTORE, 0);
Απαντήθηκε 09/12/2008 στις 23:31
πηγή χρήστη

ψήφοι
3

Για μένα, ο κωδικός δεν λειτουργεί.

Αλλά επιτέλους βρήκα τον κώδικα εργασίας. Εδώ είναι:

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;

Υποθέτω, μπορείτε να βρείτε όλες τις απαραίτητες «εισαγόμενα» λειτουργίες με απλή Googling.

Απαντήθηκε 09/09/2009 στις 11:55
πηγή χρήστη

ψήφοι
1

Αν κάποιος αναρωτιέται πώς να το κάνουμε αυτό με άλλες εφαρμογές των Windows, αυτός ο κώδικας λειτουργεί για μένα:

    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 είναι εδώ:

[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);
        }
    }
}
Απαντήθηκε 07/07/2018 στις 00:35
πηγή χρήστη

ψήφοι
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);
            }
        }
    }
Απαντήθηκε 27/09/2019 στις 18:47
πηγή χρήστη

ψήφοι
-1

Ο παραπάνω κώδικας δεν εργάζονται αρκετά για μένα σε όλες τις περιπτώσεις

Μετά τον έλεγχο των σημαιών Πρέπει επίσης να ελέγξετε showcmd = 3 και αν ναι μεγιστοποίηση άλλο αποκαταστήσει

Απαντήθηκε 15/09/2016 στις 09:04
πηγή χρήστη

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