title: Changing font in a Console window in C#
body: <p>I have a program, written in C#, that uses characters not available in Raster fonts. So I want to change font to Lucida Console.</p>
  
  <p>To change Console font programatically, I use SetCurrentConsoleFontEx() with this code (Source: <a href="http://msdn.microsoft.com/en-us/library/System.Console.aspx" rel="noreferrer">MSDN Console Class</a>) but I got an System.AccessViolationException on call SetCurrentConsoleFontEx().</p>
  
  <p>Could anyone help me? </p>
  
  <p>Thank's for your help.</p>
  
  <pre><code>using System;
  using System.Linq;
  using System.Runtime.InteropServices;
  
  
  namespace ConsoleExtender 
  {
    public static class ConsoleHelper
    {
        [StructLayout(LayoutKind.Sequential)]
        internal unsafe struct CONSOLE_FONT_INFO_EX
        {
            internal uint cbSize;
            internal uint nFont;
            internal COORD dwFontSize;
            internal int FontFamily;
            internal int FontWeight;
            internal fixed char FaceName[LF_FACESIZE];
        }
  
        [StructLayout(LayoutKind.Sequential)]
        internal struct COORD
        {
            internal short X;
            internal short Y;
  
            internal COORD(short x, short y)
            {
                X = x;
                Y = y;
            }
        }
        [DllImport("kernel32.dll", SetLastError = true)]
        static extern IntPtr GetStdHandle(int nStdHandle);
  
        [DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
        static extern bool GetCurrentConsoleFontEx(
               IntPtr consoleOutput,
               bool maximumWindow,
               ref CONSOLE_FONT_INFO_EX lpConsoleCurrentFontEx);
  
        [DllImport("kernel32.dll", SetLastError = true)]
        static extern bool SetCurrentConsoleFontEx(
               IntPtr consoleOutput,
               bool maximumWindow,
               CONSOLE_FONT_INFO_EX consoleCurrentFontEx);
  
        private const int STD_OUTPUT_HANDLE = -11;
        private const int TMPF_TRUETYPE = 4;
        private const int LF_FACESIZE = 32;
        private static IntPtr INVALID_HANDLE_VALUE = new IntPtr(-1);
  
        public static void SetConsoleFont(string fontName = "Lucida Console") 
        {
            unsafe
            {
              IntPtr hnd = GetStdHandle(STD_OUTPUT_HANDLE);
              if (hnd != INVALID_HANDLE_VALUE)
              {
                  CONSOLE_FONT_INFO_EX info = new CONSOLE_FONT_INFO_EX();
                  info.cbSize = (uint)Marshal.SizeOf(info);
  
                  // Set console font to Lucida Console.
                  CONSOLE_FONT_INFO_EX newInfo = new CONSOLE_FONT_INFO_EX();
                  newInfo.cbSize = (uint)Marshal.SizeOf(newInfo);
                  newInfo.FontFamily = TMPF_TRUETYPE;
                  IntPtr ptr = new IntPtr(newInfo.FaceName);
                  Marshal.Copy(fontName.ToCharArray(), 0, ptr, fontName.Length);
  
                  // Get some settings from current font.
                  newInfo.dwFontSize = new COORD(info.dwFontSize.X, info.dwFontSize.Y);
                  newInfo.FontWeight = info.FontWeight;
                  SetCurrentConsoleFontEx(hnd, false, newInfo);
              }
            }
        }
    }
  }
  </code></pre>