콘솔프로젝트 도중, 시작과 동시에 콘솔 창 크기를 고정하고, 창 크기를 바꾸지 못하게 고정하고 싶었다.
사실 Console.SetWindowSize()를 이용해서 창 크기를 설정할 수 있지만
이것만으로는 사용자가 마우스로 창 모서리를 드래그하거나, 최대화 버튼을 클릭하면...
콘솔 프로젝트는 그냥 망가져버릴 수 있다.
이 문제는 Window API를 사용해서 콘솔 창의 윈도우 스타일을 직접 수정하는 것으로 해결할 수 있다.
using System;
using System.Runtime.InteropServices;
namespace WeaponMasterDefense
{
public static class ConsoleWindowManager
{
[DllImport("user32.dll")]
private static extern int GetWindowLong(IntPtr hWnd, int nIndex);
[DllImport("user32.dll")]
private static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);
[DllImport("kernel32.dll", SetLastError = true)]
private static extern IntPtr GetConsoleWindow();
private const int GWL_STYLE = -16;
private const int WS_MAXIMIZEBOX = 0x00010000;
private const int WS_SIZEBOX = 0x00040000;
public static void LockConsoleSize(int width, int height)
{
// 콘솔 버퍼 및 창 크기 일치시켜서 스크롤바 제거
Console.SetBufferSize(width, height);
Console.SetWindowSize(width, height);
// Win32 API로 리사이즈 및 최대화 버튼 제거
IntPtr handle = GetConsoleWindow();
int style = GetWindowLong(handle, GWL_STYLE);
style &= ~WS_MAXIMIZEBOX; // 최대화 버튼 비활성화
style &= ~WS_SIZEBOX; // 테두리 드래그 불가
SetWindowLong(handle, GWL_STYLE, style);
}
}
}
이것이 해당 기능을 구현한 클래스다.
private const int GWL_STYLE = -16;
private const int WS_MAXIMIZEBOX = 0x00010000;
private const int WS_SIZEBOX = 0x00040000;
- GWL_STYLE : 윈도우의 스타일 정보를 조회/수정하는 인덱스
- WS_MAXIMIZEBOX : 최대화 버튼 활성화 플래그
- WS_SIZEBOX : 창 크기 조절(드래그) 가능 여부
이 두 가지 비트를 꺼주면,
사용자가 콘솔 창을 최대화하거나 크기 변경할 수 없게 된다.
이제 프로그램 시작 지점에서
ConsoleWindowManager.LockConsoleSize(120, 40);
이런식으로 메서드를 호출해 간단하게 콘솔을 고정할 수 있다.

이렇게 콘솔 크기가 고정되고, 최대화 버튼이 비활성화 된다.
단, 윈도우 11의 텝 방식 콘솔이나 맥, 리눅스 환경에서는 작동하지 않을 수 있으며
디스플레이 해상도 상태에 따라서도 최대 버퍼 크기가 다르기 때문에 주의해야한다.
'C#' 카테고리의 다른 글
| C# - 콘솔로 "2중 버퍼링 (Double Buffering)" 구현하기 (0) | 2025.10.15 |
|---|---|
| C# - GetAsnycKeyState() 기반 실시간 키 입력 처리 (0) | 2025.10.14 |
| C# - 콘솔 폰트 크기 변경하기 SetCurrentConsoleFontEx (1) | 2025.10.13 |
| C# - 메모리 구조, GC (0) | 2025.10.13 |
| C# - 정렬 알고리즘 (Sorting Algoritm) : 버블/선택/삽입/병합/퀵 정렬 (0) | 2025.10.13 |