C#의 콘솔 앱은 기본적으로 Consolas 폰트, 16픽셀 내외의 크기로 표시된다.
하지만 콘솔 게임이나 텍스트 UI를 구현할 때는, 글자 폭과 높이를 세밀하게 조정해야 한다.
이를 위해 Windows API(karnel32.dll)을 호출해 콘솔의 폰트를 직접 변경할 수 있다.
필자는 텍스트 셀의 크기를 많이 줄여서 실제 픽셀처럼 사용하기 위해 이 기능을 사용했다.
Windows API를 통한 콘솔 제어
C#의 System.Console 클래스는 기본적인 출력 기능만 제공한다.
폰트 크기, 폭, 이름 등을 직접 바꾸는 기능은 없다.
따라서 폰트를 조정하기 위해선 Win32 API를 직접 호출해야 하는데
이때 C#에서 C/C++ DLL 함수를 호출하기 위해 사용하는 기능이 바로 P/Invoke (Platform Invoke) 다.
아래는 전체 코드 구조다.
using System;
using System.Runtime.InteropServices;
namespace WeaponMasterDefense
{
public static class ConsoleFontManager
{
[DllImport("kernel32.dll", SetLastError = true)]
static extern bool SetCurrentConsoleFontEx(
IntPtr hConsoleOutput, bool bMaximumWindow, ref CONSOLE_FONT_INFOEX lpConsoleCurrentFontEx);
[DllImport("kernel32.dll", SetLastError = true)]
static extern IntPtr GetStdHandle(int nStdHandle);
private const int STD_OUTPUT_HANDLE = -11;
[StructLayout(LayoutKind.Sequential)]
public struct COORD
{
public short X;
public short Y;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct CONSOLE_FONT_INFOEX
{
public uint cbSize;
public uint nFont;
public COORD dwFontSize;
public int FontFamily;
public int FontWeight;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
public string FaceName;
}
// 폰트 크기 설정
public static void SetFontSize(short width, short height, string font = "Consolas")
{
IntPtr hnd = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_FONT_INFOEX info = new CONSOLE_FONT_INFOEX();
info.cbSize = (uint)Marshal.SizeOf(info);
info.FaceName = font;
info.dwFontSize = new COORD { X = width, Y = height };
SetCurrentConsoleFontEx(hnd, false, ref info);
}
}
}
실제 사용 예시는 아래와 같다
class Program
{
static void Main()
{
ConsoleFontManager.SetFontSize(8, 16, "Consolas");
Console.WriteLine("폰트 크기 변경 완료!");
Console.ReadKey();
}
}
줄여진 폰트로 아스키아트로 문자를 그려보았더니

원래 문자보다 1/4 정도 크기가 줄어서 제법 괜찮게 표현된 거 같다.
참고로 아래쪽의 PRESS ANY BUTTON 부분도 전부 원래 문자가 아니라 패턴으로 만든 거다.
문제는 폰트 크기를 줄일 뿐, 최대 버퍼 길이는 그대로이기에 이것 만으로 픽셀처럼 문자를 작게 활용하는 건 한계가 있는 듯 하다.
'C#' 카테고리의 다른 글
| C# - GetAsnycKeyState() 기반 실시간 키 입력 처리 (0) | 2025.10.14 |
|---|---|
| C# - LockConsoleSize() : 콘솔 창 크기 고정 및 리사이즈 방지 (1) | 2025.10.14 |
| C# - 메모리 구조, GC (0) | 2025.10.13 |
| C# - 정렬 알고리즘 (Sorting Algoritm) : 버블/선택/삽입/병합/퀵 정렬 (0) | 2025.10.13 |
| C# - 피셔 예이츠 셔플 (Fisher Yates Shuffle) (0) | 2025.10.13 |