如何将窗口恢复到原始状态(与之前相同的高度和宽度)?

时间:2015-07-09 04:20:49

标签: c# .net winapi c#-4.0

此处(下面的示例程序)如果记事本调整大小 - >最大化然后缩小。不保留窗口位置(最大化)。

我希望在最小化之前保持窗口位置。

我已经尝试了以下代码。请帮忙。

公共部分类Form1:表单     {         公共Form1()         {             的InitializeComponent();         }

    private readonly IntPtr HWND_TOPMOST = new IntPtr(0);

    private void button1_Click(object sender, EventArgs e)
    {
        Process[] Processes = Process.GetProcessesByName("notepad");
        string processString = string.Format("Untitled - Notepad");
        IntPtr res;
        foreach (Process theprocess in Processes)
        {
            if (theprocess.MainWindowTitle.Contains(processString))
            {
                if (theprocess.MainWindowHandle == IntPtr.Zero)
                {
                    continue;
                }
                WindowsNativeCalls.SetActiveWindow(theprocess.MainWindowHandle);

                if (theprocess.MainWindowHandle != IntPtr.Zero)
                {
                    if (theprocess.MainWindowTitle.Contains(processString))
                    {
                        WindowsNativeCalls.WINDOWPLACEMENT placement = new WindowsNativeCalls.WINDOWPLACEMENT();
                        WindowsNativeCalls.GetWindowPlacement(theprocess.MainWindowHandle, ref placement);
                        switch (placement.showCmd)
                        {
                            case 1:// SW_NORMAL
                            case 3:// SW_MAXIMIZE does the job of bring to front

                                WindowsNativeCalls.SetWindowPos(theprocess.MainWindowHandle, HWND_TOPMOST, 0, 0, 0, 0, WindowsNativeCalls.SWP_NOMOVE | WindowsNativeCalls.SWP_NOSIZE | WindowsNativeCalls.SWP_SHOWWINDOW);
                                break;

                            case 2: // SW_SHOWMINIMIZED 
                                placement.showCmd = 9;
                                WindowsNativeCalls.SetWindowPlacement(theprocess.MainWindowHandle, ref placement);
                                //res = WindowsNativeCalls.SendMessage(theprocess.MainWindowHandle, WindowsNativeCalls.WM_SYSCOMMAND, (IntPtr)WindowsNativeCalls.SW_SHOWNORMAL, IntPtr.Zero);
                                break;
                        }
                    }
                }
            }
        }
    }
}

公共类WindowsNativeCalls     {         #region Fields

    /// <summary>
    /// Hide Window
    /// </summary>
    public const int SW_HIDE = 0;
    /// <summary>
    /// Show Normal
    /// </summary>
    public const int SW_SHOWNORMAL = 1;
    /// <summary>
    /// Minimize Window
    /// </summary>
    public const int SW_SHOWMINIMIZED = 2;
    /// <summary>
    /// Maxiize Window
    /// </summary>
    public const int SW_SHOWMAXIMIZED = 3;
    /// <summary>
    /// Activate Window
    /// </summary>
    public const int SW_SHOWNOACTIVATE = 4;
    /// <summary>
    /// Restore Window
    /// </summary>
    public const int SW_RESTORE = 9;

    /// <summary>
    /// SW_SHOW
    /// </summary>
    public const int SW_SHOW = 5;
    /// <summary>
    /// Default Window
    /// </summary>
    public const int SW_SHOWDEFAULT = 10;
    /// <summary>
    /// Close Windows message
    /// </summary>
    public const uint WM_CLOSE = 0x10;
    /// <summary>
    /// Screen Window Position to No Size Change
    /// </summary>
    public const UInt32 SWP_NOSIZE = 0x0001;
    /// <summary>
    /// Screen Window Position to No Move Change
    /// </summary>
    public const UInt32 SWP_NOMOVE = 0x0002;
    /// <summary>
    /// Screen Window Position to Show Window
    /// </summary>
    public const UInt32 SWP_SHOWWINDOW = 0x0040;
    /// <summary>
    /// Maximize Window in Graphics mode
    /// </summary>
    public const int SC_MAXIMIZE = 0xF030;
    /// <summary>
    /// Resize Windows message
    /// </summary>
    public const uint WM_SYSCOMMAND = 0x0112;


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

    public struct RECT
    {
        public int left;
        public int top;
        public int right;
        public int bottom;
    }

    public struct WINDOWPLACEMENT
    {
        public int length;
        public int flags;
        public int showCmd;
        public POINTAPI ptMinPosition;
        public POINTAPI ptMaxPosition;
        public RECT rcNormalPosition;
    }
    #endregion

    #region DllImport Functions

    /// <summary>
    /// Sets the show state of a window created.
    /// </summary>
    /// <param name="hWnd">Window Handle</param>
    /// <param name="nCmdShow">Show state</param>
    /// <returns>Returns True if successful</returns>
    [DllImport("user32.dll")]
    public static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);

    /// <summary>
    /// Sets window in Forefront and activates it
    /// </summary>
    /// <param name="hWnd">Window Handle</param>
    /// <returns>Returns True if successfu</returns>
    [DllImport("user32.dll")]
    public static extern bool SetForegroundWindow(IntPtr hWnd);


    /// <summary>
    /// Sets the show state of a window created.
    /// </summary>
    /// <param name="hWnd">Window Handle</param>
    /// <param name="nCmdShow">Show state</param>
    /// <returns>Returns True if successful</returns>
    [DllImport("user32.dll")]
    public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    public static extern bool GetWindowPlacement(IntPtr hWnd, ref WINDOWPLACEMENT lpwndpl);
    [DllImport("user32.dll", SetLastError = true)]
    public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
    [DllImport("user32.dll")]
    public static extern bool SetWindowPlacement(IntPtr hWnd, ref WINDOWPLACEMENT lpwndpl);

    [DllImport("user32.dll")]
    public static extern IntPtr GetForegroundWindow();

    [DllImport("user32.dll")]
    public static extern int GetWindowText(IntPtr hWnd, System.Text.StringBuilder text, int count);

    [DllImport("user32.dll")]
    public static extern bool IsIconic(IntPtr hWnd);

    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
    public static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);

    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    public static extern bool EnumWindows(EnumedWindow lpEnumFunc, ArrayList lParam);

    public delegate bool EnumedWindow(IntPtr handleWindow, ArrayList handles);

    [DllImport("user32")]
    [return: MarshalAs(UnmanagedType.Bool)]
    public static extern bool EnumChildWindows(IntPtr window, EnumedWindow callback, ArrayList lParam);

    [DllImport("user32.dll")]
    public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);

    [DllImport("user32.dll", SetLastError = true)]
    public static extern IntPtr SetActiveWindow(IntPtr hWnd);

    [StructLayout(LayoutKind.Sequential)]
    public struct WINDOWINFO
    {
        public uint cbSize;
        public RECT rcWindow;
        public RECT rcClient;
        public uint dwStyle;
        public uint dwExStyle;
        public uint dwWindowStatus;
        public uint cxWindowBorders;
        public uint cyWindowBorders;
        public ushort atomWindowType;
        public ushort wCreatorVersion;

        public WINDOWINFO(Boolean? filler)
            : this()   
        {
            cbSize = (UInt32)(Marshal.SizeOf(typeof(WINDOWINFO)));
        }

    }
    [DllImport("user32.dll", SetLastError = true)]
    public static extern bool GetWindowInfo(IntPtr hwnd, ref WINDOWINFO pwi);

    #endregion
}

2 个答案:

答案 0 :(得分:2)

如果您希望窗口使用其先前的位置,请不要通过调用<div id="a"> <div class="b"></div> <div class="b"></div> <div class="b"></div> <div class="b"></div> <div class="b"></div> <div class="b"></div> <div class="b"></div> <div class="b"></div> <div class="b"></div> </div>覆盖窗口位置信息。

相反,只需通过使用适当的命令(即SetWindowPos())调用ShowWindow()来最小化窗口。然后当你恢复它时,它以前的位置信息仍然存在。


&LT;一旁&GT;
顺便说一句,您的代码检查SW_MINIMIZE的窗口句柄和窗口标题两次的任何特定原因?
&LT; /预留&GT;

答案 1 :(得分:0)

 switch (placement.showCmd) 
                {
                    case 2: // Activates and displays the window -- This case only when the window is minimized.
                        WindowsNativeCalls.ShowWindow(theprocess.MainWindowHandle, WindowsNativeCalls.SW_RESTORE);
                        break;
                    default: // Bring to Front - For all other cases
                        WindowsNativeCalls.SetWindowPos(theprocess.MainWindowHandle, HWND_TOPMOST, 0, 0, 0, 0, WindowsNativeCalls.SWP_NOMOVE | WindowsNativeCalls.SWP_NOSIZE | WindowsNativeCalls.SWP_SHOWWINDOW);
                        break;

                }