[태그:] <span>GetStdHandle</span>

 이번 강의는 콘솔 글자 색을 바꾸는 실습입니다.

 별다른 알고리즘은 없고 필요한 몇 개의 기술을 사용할 거예요.

 기술 사용 노하우를 들여다 보고 따라해 보는 것이라 크게 고민을 하실 필요는 없어요.

콘솔 글자 색 바꾸기 실행 화면

 콘솔의 글자 색을 바꾸기 위해 Windows API 함수를 사용할 수 있어요.

- 콘솔의 글자 색을 바꾸는 함수
WINBASEAPI BOOL WINAPI SetConsoleTextAttribute(_In_ HANDLE hConsoleOutput,_In_ WORD wAttributes);
    
- 표준 핸들을 얻어오는 함수
    WINBASEAPI HANDLE WINAPI GetStdHandle(_In_ DWORD nStdHandle);
    
- 표준 출력 핸들 상수
    #define STD_OUTPUT_HANDLE   ((DWORD)-11)    

 Windows API와 같은 Native 기술을 사용할 때 DllImport 어튜리뷰트를 이용하여 외부에 있다는 것을 선언해 주어야 합니다. 

그리고 인자 형식이 BOOL, INT, DWORD 등은 int로 표현하세요.

WORD는 short 형식으로 표현하세요.

HANDLE이나 포인터 형식은 IntPtr로 표현하세요.

선언문에서 정적 멤버로 캡슐화하고 외부에 있는 것을 extern으로 나타냅니다.

[DllImport("Kernel32.dll")]
static extern int SetConsoleTextAttribute(IntPtr hConsoleOutput, short wAttributes);

[DllImport("Kernel32.dll")]
static extern IntPtr GetStdHandle(int nStdHandle);    

매크로 상수는 const 멤버로 설정하세요. 

 여기에서 이러한 멤버들은 WrapAPI 클래스를 만들어서 래핑(Wrapping)할게요. 단순히 래핑 목적이라 정적 클래스로 정의하는 것을 권합니다. 그리고 외부에서 접근해서 사용할 수 있는 멤버 메서드를 만들어 위에 선언한 멤버를 사용할게요.

 이를 표현한 전체 코드입니다. 참고로 콘솔에서 사용할 수 있는 0~15까지의 색상 값을 열거형으로 정의했어요.

using System;
using System.Runtime.InteropServices;

namespace Windows_API_활용하여_콘솔_글자색_바꾸기
{
    public enum ConTextColor { LACK, BLUE, GREEN, JADE, RED,
        PURPLE, YELLOW, WHITE, GRAY, LIGHT_BLUE, LIGHT_GREEN,
        LIGHT_JADE, LIGHT_RED, LIGHT_PURPLE,
        LIGHT_YELLOW, LIGHT_WHITE };

    public static class WrapAPI
    {
        [DllImport("Kernel32.dll")]
        static extern int SetConsoleTextAttribute(IntPtr hConsoleOutput, short wAttributes);

        [DllImport("Kernel32.dll")]
        static extern IntPtr GetStdHandle(int nStdHandle);

        const int STD_OUTPUT_HANDLE = -11;
        public static void SetConsoleTextColor(ConTextColor color)
        {
            IntPtr handle = GetStdHandle(STD_OUTPUT_HANDLE);
            SetConsoleTextAttribute(handle, (short)color);
        }
    }
}

 이제 래핑한 WrapAPI SetConsoleTextColor 정적 메서드를 사용하면 끝입니다.

//https://ehpub.co.kr
//실력으로 다지는 C#
//Windows API를 활용하여 콘솔 글자색 바꾸기

using System;
namespace Windows_API_활용하여_콘솔_글자색_바꾸기
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.ReadKey();
            WrapAPI.SetConsoleTextColor(ConTextColor.GREEN);
            Console.WriteLine("언제나 휴일");
            Console.ReadKey();
            WrapAPI.SetConsoleTextColor(ConTextColor.WHITE);
            Console.WriteLine("실습으로 다지는 C#");
            Console.ReadKey();
            WrapAPI.SetConsoleTextColor(ConTextColor.LIGHT_PURPLE);
            Console.WriteLine("https://ehpub.co.kr");
            Console.ReadKey();
            WrapAPI.SetConsoleTextColor(ConTextColor.WHITE);
        }
    }
}

 낯선 기술을 사용하는 것은 두려울 수도 있지만 즐길 수 있다면 웃음을 줄 수도 있어요.

C# 실습