如何将窗口还原为其原始状态(与之前相同的高度和宽度)?

拉吉

此处(在示例程序下方)是否调整了记事本的大小->最大化然后最小化。窗口位置(最大化)不会保留。

我想在最小化之前保持窗口位置不变。

我已经尝试了下面的代码。请帮助。

公共部分类Form1:表单{public 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字段

    /// <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
}
彼得·杜尼奥(Peter Duniho)

如果您希望窗口使用其先前位置,请不要通过调用覆盖窗口位置信息SetWindowPos()

相反,只需通过ShowWindow()使用适当的命令(即SW_MINIMIZE进行调用来最小化窗口然后,当您还原它时,它的先前位置信息将仍然存在。


<aside>
顺便说一句,您的代码有两次检查窗口句柄null和窗口标题的特殊原因是什么?</ aside>

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将div还原为其原始状态

来自分类Dev

如何将ImageView与底部对齐,填充其宽度和高度并保持其纵横比?

来自分类Dev

如何显示其原始宽度和高度的纹理

来自分类Dev

如何将TypeList还原回其原始参数包

来自分类Dev

如何还原为原始CSS?

来自分类Dev

如何将AMD驱动程序还原为以前的工作状态?

来自分类Dev

如何将AMD驱动程序还原为以前的工作状态?

来自分类Dev

在调整窗口大小之前如何检查宽度和高度?

来自分类Dev

react-konva 如何将舞台宽度和高度设置为等于其容器?

来自分类Dev

如何将视图高度设置为等于其宽度

来自分类Dev

如何将“编辑文本”设置回其原始状态

来自分类Dev

如何将Shotwell重置为其原始状态

来自分类Dev

将窗口解开到其原始状态

来自分类Dev

如何将推送的提交还原为未登台?

来自分类Dev

如何将张量汇总还原为变量

来自分类Dev

将密码还原为原始密码

来自分类Dev

如何从搜索还原为原始命令

来自分类Dev

如何将原始二进制数据查看为具有给定宽度和高度的图像?

来自分类Dev

我可以在操作之前将元素上的事件还原为状态吗?

来自分类Dev

如何将视图框的高度和宽度导出为网页的高度和宽度

来自分类Dev

如何将根窗口大小设置为屏幕宽度和高度的一半Python Tkinter

来自分类Dev

如何将固定宽度和高度设置为SVG

来自分类Dev

使用jQuery交换文本,如何将其他文本还原为原始文本?

来自分类Dev

如何防止之前伪元素的内容溢出其宽度和高度?

来自分类Dev

如何固定WPF窗口的高度和宽度

来自分类Dev

如何安全地将Intl.numberFormat反向还原为原始数字格式

来自分类Dev

如何设置图像的高度和宽度相同?

来自分类Dev

如何将WPF椭圆的高度绑定到其自己的宽度?

来自分类Dev

将备份表数据还原为原始表SQL

Related 相关文章

  1. 1

    将div还原为其原始状态

  2. 2

    如何将ImageView与底部对齐,填充其宽度和高度并保持其纵横比?

  3. 3

    如何显示其原始宽度和高度的纹理

  4. 4

    如何将TypeList还原回其原始参数包

  5. 5

    如何还原为原始CSS?

  6. 6

    如何将AMD驱动程序还原为以前的工作状态?

  7. 7

    如何将AMD驱动程序还原为以前的工作状态?

  8. 8

    在调整窗口大小之前如何检查宽度和高度?

  9. 9

    react-konva 如何将舞台宽度和高度设置为等于其容器?

  10. 10

    如何将视图高度设置为等于其宽度

  11. 11

    如何将“编辑文本”设置回其原始状态

  12. 12

    如何将Shotwell重置为其原始状态

  13. 13

    将窗口解开到其原始状态

  14. 14

    如何将推送的提交还原为未登台?

  15. 15

    如何将张量汇总还原为变量

  16. 16

    将密码还原为原始密码

  17. 17

    如何从搜索还原为原始命令

  18. 18

    如何将原始二进制数据查看为具有给定宽度和高度的图像?

  19. 19

    我可以在操作之前将元素上的事件还原为状态吗?

  20. 20

    如何将视图框的高度和宽度导出为网页的高度和宽度

  21. 21

    如何将根窗口大小设置为屏幕宽度和高度的一半Python Tkinter

  22. 22

    如何将固定宽度和高度设置为SVG

  23. 23

    使用jQuery交换文本,如何将其他文本还原为原始文本?

  24. 24

    如何防止之前伪元素的内容溢出其宽度和高度?

  25. 25

    如何固定WPF窗口的高度和宽度

  26. 26

    如何安全地将Intl.numberFormat反向还原为原始数字格式

  27. 27

    如何设置图像的高度和宽度相同?

  28. 28

    如何将WPF椭圆的高度绑定到其自己的宽度?

  29. 29

    将备份表数据还原为原始表SQL

热门标签

归档