using System.ComponentModel;
using System.Runtime.InteropServices;
namespace TestProject;
/// <summary>
/// 콘솔 헬퍼
/// </summary>
public static class ConsoleHelper
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Method
////////////////////////////////////////////////////////////////////////////////////////// Static
//////////////////////////////////////////////////////////////////////////////// Private
#region 표준 장치 핸들 구하기 - GetStdHandle(standardDevice)
/// <summary>
/// 표준 장치 핸들 구하기
/// </summary>
/// <param name="standardDevice">표준 장치</param>
/// <returns>표준 장치 핸들</returns>
[DllImport("kernel32", SetLastError = true)]
private static extern IntPtr GetStdHandle(int standardDevice);
#endregion
#region 현재 콘솔 폰트 설정하기 (확장) - SetCurrentConsoleFontEx(consoleOutputHandle, maximumWindow, fontInfo)
/// <summary>
/// 현재 콘솔 폰트 설정하기 (확장)
/// </summary>
/// <param name="consoleOutputHandle">콘솔 출력 핸들</param>
/// <param name="maximumWindow">최대 윈도우 여부</param>
/// <param name="fontInfo">폰트 정보</param>
/// <returns>처리 결과</returns>
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("kernel32", SetLastError = true, CharSet = CharSet.Unicode)]
private static extern bool SetCurrentConsoleFontEx(IntPtr consoleOutputHandle, bool maximumWindow, ref FontInfo fontInfo);
#endregion
#region 현재 콘솔 폰트 구하기 (확장) - GetCurrentConsoleFontEx(consoleOutputHandle, maximumWindow, fontInfo)
/// <summary>
/// 현재 콘솔 폰트 구하기 (확장)
/// </summary>
/// <param name="consoleOutputHandle">콘솔 출력 핸들</param>
/// <param name="maximumWindow">최대 윈도우 여부</param>
/// <param name="fontInfo">폰트 정보</param>
/// <returns>처리 결과</returns>
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("kernel32", SetLastError = true, CharSet = CharSet.Unicode)]
private static extern bool GetCurrentConsoleFontEx(IntPtr consoleOutputHandle, bool maximumWindow, ref FontInfo fontInfo);
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Field
////////////////////////////////////////////////////////////////////////////////////////// Static
//////////////////////////////////////////////////////////////////////////////// Private
#region Field
/// <summary>
/// 콘솔 출력 핸들
/// </summary>
private static readonly IntPtr _consoleOutputHandle = GetStdHandle(STANDARD_OUTPUT_HANDLE);
#endregion
////////////////////////////////////////////////////////////////////////////////////////// Instance
//////////////////////////////////////////////////////////////////////////////// Private
#region Field
/// <summary>
/// FIXED_WIDTH_TRUE_TYPE
/// </summary>
private const int FIXED_WIDTH_TRUE_TYPE = 54;
/// <summary>
/// STANDARD_OUTPUT_HANDLE
/// </summary>
private const int STANDARD_OUTPUT_HANDLE = -11;
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Method
////////////////////////////////////////////////////////////////////////////////////////// Static
//////////////////////////////////////////////////////////////////////////////// Public
#region 현재 폰트 설정하기 - SetCurrentFont(fontName, fontSize)
/// <summary>
/// 현재 폰트 설정하기
/// </summary>
/// <param name="fontName">폰트명</param>
/// <param name="fontSize">폰트 크기</param>
/// <returns>폰트 정보 배열</returns>
public static FontInfo[] SetCurrentFont(string fontName, short fontSize = 0)
{
FontInfo currentFontInfo = new FontInfo { Size = Marshal.SizeOf<FontInfo>() };
if(GetCurrentConsoleFontEx(_consoleOutputHandle, false, ref currentFontInfo))
{
FontInfo fontInfo = new FontInfo
{
Size = Marshal.SizeOf<FontInfo>(),
FontIndex = 0,
FontFamily = FIXED_WIDTH_TRUE_TYPE,
FontName = fontName,
FontWeight = 400,
FontSize = fontSize > 0 ? fontSize : currentFontInfo.FontSize
};
if(!SetCurrentConsoleFontEx(_consoleOutputHandle, false, ref fontInfo))
{
int error = Marshal.GetLastWin32Error();
throw new Win32Exception(error);
}
FontInfo fontInfoUpdated = new FontInfo { Size = Marshal.SizeOf<FontInfo>() };
GetCurrentConsoleFontEx(_consoleOutputHandle, false, ref fontInfoUpdated);
return new FontInfo[]
{
currentFontInfo,
fontInfo,
fontInfoUpdated
};
}
else
{
int error = Marshal.GetLastWin32Error();
throw new Win32Exception(error);
}
}
#endregion
#region 현재 폰트 정보 구하기 - GetCurrentFontInfo()
/// <summary>
/// 현재 폰트 정보 구하기
/// </summary>
/// <returns>현재 폰트 정보</returns>
public static FontInfo GetCurrentFontInfo()
{
FontInfo fontInfo = new FontInfo
{
Size = Marshal.SizeOf<FontInfo>()
};
if(!GetCurrentConsoleFontEx(_consoleOutputHandle, false, ref fontInfo))
{
int error = Marshal.GetLastWin32Error();
throw new Win32Exception(error);
}
return fontInfo;
}
#endregion
}