Visszaállítása WindowState származó Minimized

szavazat
26

Van egy egyszerű módszer, hogy helyreállítsa egy minimalizált formában a korábbi állapotot, Normal vagy Maximális? Várok egyforma alkalmassága mint kattintva a tálcán (vagy jobb egérgombbal, és válassza helyreállítása).

Eddig én ezt, de ha a formát előzőleg maximális, még mindig jön vissza, mint egy normál ablakot.

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

Kell kezelni az állam formájának változása emlékezni az előző állapot?

A kérdést 09/12/2008 23:16
a forrás felhasználó
Más nyelveken...                            


6 válasz

szavazat
32

Én a következő bővítményt módszer:

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

Majd hívja form.Restore()a kódomat.

Válaszolt 27/04/2010 22:20
a forrás felhasználó

szavazat
11

A legegyszerűbb módja annak, hogy helyreállítsa az űrlapot normál állapota:

if (MyForm.WindowState == FormWindowState.Minimized)
{
    MyForm.WindowState = FormWindowState.Normal;
}
Válaszolt 24/02/2015 13:26
a forrás felhasználó

szavazat
4

Lehet szimulálni kattintva a tálcán gomb, mint ez:

SendMessage(docView.Handle, WM_SYSCOMMAND, SC_RESTORE, 0);
Válaszolt 09/12/2008 23:31
a forrás felhasználó

szavazat
3

Számomra a fenti kód nem működik.

De végül megtaláltam a működő kód. Itt van:

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;

Azt hiszem, megtalálja az összes szükséges „importált” funkciók egyszerű googling.

Válaszolt 09/09/2009 11:55
a forrás felhasználó

szavazat
1

Ha valaki azon tűnődik, hogyan kell csinálni, hogy más alkalmazásokat ablakok, ez a kód működik nekem:

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

[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);
        }
    }
}
Válaszolt 07/07/2018 00:35
a forrás felhasználó

szavazat
-1

A fenti kód nem egészen működik nekem minden helyzetben

Miután ellenőrizte a zászlók azt is ellenőriznie kell, showcmd = 3, és ha igen maximalizálása mást helyreállítása

Válaszolt 15/09/2016 09:04
a forrás felhasználó

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