Search code examples
c#windowsconsole-applicationwindow-positionnetcoreapp3.1

How to move C# Console Application window to the center of the screen


I'm working with a C# Console Application. How can I move the application window to the center of the screen?

Additional details

Framework version: .NET Core 3.1
Size of the window: 37x20 (Console.SetWindowSize(37, 20);)


Solution

  • Made a small utility class that allows you to center your console window.

    Usage example:

    WindowUtility.MoveWindowToCenter();
    

    Full source code:

    using System;
    using System.Diagnostics;
    using System.Runtime.InteropServices;
    
    static class WindowUtility
    {
        [DllImport("user32.dll", SetLastError = true)]
        static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
    
        [DllImport("user32.dll", SetLastError = true)]
        static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);
    
        const uint SWP_NOSIZE = 0x0001;
        const uint SWP_NOZORDER = 0x0004;
    
        private static Size GetScreenSize() => new Size(GetSystemMetrics(0), GetSystemMetrics(1));
    
        private struct Size
        {
            public int Width { get; set; }
            public int Height { get; set; }
    
            public Size(int width, int height)
            {
                Width = width;
                Height = height;
            }
        }
    
        [DllImport("User32.dll", ExactSpelling = true, CharSet = CharSet.Auto)]
        private static extern int GetSystemMetrics(int nIndex);
    
        [DllImport("user32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        private static extern bool GetWindowRect(HandleRef hWnd, out Rect lpRect);
    
        [StructLayout(LayoutKind.Sequential)]
        private struct Rect
        {
            public int Left;        // x position of upper-left corner
            public int Top;         // y position of upper-left corner
            public int Right;       // x position of lower-right corner
            public int Bottom;      // y position of lower-right corner
        }
    
        private static Size GetWindowSize(IntPtr window)
        {
            if (!GetWindowRect(new HandleRef(null, window), out Rect rect))
                throw new Exception("Unable to get window rect!");
    
            int width = rect.Right - rect.Left;
            int height = rect.Bottom - rect.Top;
    
            return new Size(width, height);
        }
    
        public static void MoveWindowToCenter()
        {
            IntPtr window = Process.GetCurrentProcess().MainWindowHandle;
    
            if (window == IntPtr.Zero)
                throw new Exception("Couldn't find a window to center!");
    
            Size screenSize = GetScreenSize();
            Size windowSize = GetWindowSize(window);
    
            int x = (screenSize.Width - windowSize.Width) / 2;
            int y = (screenSize.Height - windowSize.Height) / 2;
    
            SetWindowPos(window, IntPtr.Zero, x, y, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
        }
    }
    

    References:

    Bunch of StackOverflow posts that helped me put together this solution. https://stackoverflow.com/a/42306412/5946094
    https://stackoverflow.com/a/13547659/5946094
    https://stackoverflow.com/a/43793468/5946094
    https://stackoverflow.com/a/31273557/5946094