Search code examples
c#.netinteropconsole

Is it possible to get/set the console font size?


I have seen posts on changing console true type font and console colors (rgb) but nothing on setting or getting the console font size.

The reason I want to change the font size is because a grid is printed to the console, and the grid has many columns, so, it fits better with a smaller font. I'm wondering if it's possible to change it at runtime rather than allowing the default or configured fonts to take priority / override inheritance.


Solution

  • Maybe this article can help you

    ConsoleHelper.cs

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Runtime.InteropServices;
    using System.Drawing;
    
    namespace ConsoleExtender {
        [StructLayout(LayoutKind.Sequential, Pack = 1)]
        public struct ConsoleFont {
            public uint Index;
            public short SizeX, SizeY;
        }
    
        public static class ConsoleHelper {
            [DllImport("kernel32")]
            public static extern bool SetConsoleIcon(IntPtr hIcon);
    
            public static bool SetConsoleIcon(Icon icon) {
                return SetConsoleIcon(icon.Handle);
            }
    
            [DllImport("kernel32")]
            private extern static bool SetConsoleFont(IntPtr hOutput, uint index);
    
            private enum StdHandle {
                OutputHandle = -11
            }
    
            [DllImport("kernel32")]
            private static extern IntPtr GetStdHandle(StdHandle index);
    
            public static bool SetConsoleFont(uint index) {
                return SetConsoleFont(GetStdHandle(StdHandle.OutputHandle), index);
            }
    
            [DllImport("kernel32")]
            private static extern bool GetConsoleFontInfo(IntPtr hOutput, [MarshalAs(UnmanagedType.Bool)]bool bMaximize, 
                uint count, [MarshalAs(UnmanagedType.LPArray), Out] ConsoleFont[] fonts);
    
            [DllImport("kernel32")]
            private static extern uint GetNumberOfConsoleFonts();
    
            public static uint ConsoleFontsCount {
                get {
                    return GetNumberOfConsoleFonts();
                }
            }
    
            public static ConsoleFont[] ConsoleFonts {
                get {
                    ConsoleFont[] fonts = new ConsoleFont[GetNumberOfConsoleFonts()];
                    if(fonts.Length > 0)
                        GetConsoleFontInfo(GetStdHandle(StdHandle.OutputHandle), false, (uint)fonts.Length, fonts);
                    return fonts;
                }
            }
    
        }
    }
    

    Here is how to use it to list true type fonts for console,

    static void Main(string[] args) {
       var fonts = ConsoleHelper.ConsoleFonts;
       for(int f = 0; f < fonts.Length; f++)
          Console.WriteLine("{0}: X={1}, Y={2}",
             fonts[f].Index, fonts[f].SizeX, fonts[f].SizeY);
    
       ConsoleHelper.SetConsoleFont(5);
       ConsoleHelper.SetConsoleIcon(SystemIcons.Information);
    }
    

    Crucial functions: SetConsoleFont, GetConsoleFontInfo and GetNumberOfConsoleFonts. They're undocumented, so use at your own risk.