How to set the height of a window using c#?

后端 未结 2 1063
我寻月下人不归
我寻月下人不归 2020-12-16 00:05

Is it possible to set the height of a window using the window handle or process handle?

I have the following so far, assume the application in question is notepad.

相关标签:
2条回答
  • 2020-12-16 00:51

    You should be able to use the Win32 SetWindowPos function (use for both position and size). Here's a link for how to do it in C#.

    Here's a quick sample. This will move notepad to (10,10) on the screen, and resize it to (450,450):

    class Program
    {
        [DllImport("user32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, SetWindowPosFlags uFlags);
    
        static void Main(string[] args)
        {
            Console.WriteLine("Start notepad and hit any key...");
            Console.ReadKey(true);
            Process[] processes = Process.GetProcessesByName("notepad");
    
            foreach (Process p in processes)
            {
                var handle = p.MainWindowHandle;
    
                SetWindowPos(handle, new IntPtr(SpecialWindowHandles.HWND_TOP), 10,10,450,450,SetWindowPosFlags.SWP_SHOWWINDOW);
    
                break;
    
            }
    
        }
    }
    
    public enum SpecialWindowHandles
    {
        HWND_TOP = 0,
        HWND_BOTTOM = 1,
        HWND_TOPMOST = -1,
        HWND_NOTOPMOST = -2
    }
    
    [Flags]
    public enum SetWindowPosFlags : uint
    {
        SWP_ASYNCWINDOWPOS = 0x4000,
    
        SWP_DEFERERASE = 0x2000,
    
        SWP_DRAWFRAME = 0x0020,
    
        SWP_FRAMECHANGED = 0x0020,
    
        SWP_HIDEWINDOW = 0x0080,
    
        SWP_NOACTIVATE = 0x0010,
    
        SWP_NOCOPYBITS = 0x0100,
    
        SWP_NOMOVE = 0x0002,
    
        SWP_NOOWNERZORDER = 0x0200,
    
        SWP_NOREDRAW = 0x0008,
    
        SWP_NOREPOSITION = 0x0200,
    
        SWP_NOSENDCHANGING = 0x0400,
    
        SWP_NOSIZE = 0x0001,
    
        SWP_NOZORDER = 0x0004,
    
        SWP_SHOWWINDOW = 0x0040,
    }
    
    0 讨论(0)
  • 2020-12-16 00:57

    This is how I would do it:

    using System;
    using System.Diagnostics;
    using System.Runtime.InteropServices;
    
    namespace ConsoleApplication1
    {
        class Program
        {
            [StructLayout(LayoutKind.Sequential)]
            public struct RECT
            {
                public int left;
                public int top;
                public int right;
                public int bottom;
            }
    
            [DllImport("user32.dll", SetLastError = true)]
            static extern bool GetWindowRect(IntPtr hWnd, ref RECT Rect);
    
            [DllImport("user32.dll", SetLastError = true)]
            static extern bool MoveWindow(IntPtr hWnd, int X, int Y, int Width, int Height, bool Repaint);
    
            static void Main(string[] args)
            {
                Process[] processes = Process.GetProcessesByName("notepad");
                foreach (Process p in processes)
                {
                    IntPtr handle = p.MainWindowHandle;
                    RECT Rect = new RECT();
                    if (GetWindowRect(handle, ref Rect))
                        MoveWindow(handle, Rect.left, Rect.right, Rect.right-Rect.left, Rect.bottom-Rect.top + 50, true);
                }
            }
        }
    }
    

    While you can do it with SetWindowPos, and SetWindowPos is the newer and more capable API, MoveWindow is just easier to call.

    0 讨论(0)
提交回复
热议问题