프로그래밍/C#, .NET

[.NET] 콘솔 애플리케이션(console application)에서 'F11(전체 화면 전환)' 막기

당근천국 2022. 10. 5. 15:30

다른 포스팅에서 한번 다룬 내용이지만

그 포스팅은 종합적인 내용이라 검색하기 좋게 분리한 내용입니다.

 

연관글 영역

 

 

1. 증상

콘솔 애플리케이션(console application)에서 'F11'을 누르면 전체화면으로 전환됩니다.

 

이렇게 되면 키 이벤트로 'F11'을 받을 수 없게 됩니다.

 

 

2. 해결

'WinAPI'를 이용하여 '시스템 입력'을 꺼주면 됩니다.

'시스템 입력'을 끄게 되면 'Ctrl + C' 같은 시스템 단축키도 동작하지 않습니다.

 

'WinAPI'를 사용하려면

1) 애플리케이션의 핸들을 가지고 와서 

2) 콘솔 모드를 읽은 후

3) 읽은 모드를 변경하고

4) 변경된 콘솔 모드를 적용

하면 됩니다.

 

 

2-1. 사용할 함수 마샬링

필요한 함수는 

GetStdHandle : 애플리케이션의 핸들을 가지고 오는 함수

GetConsoleMode : 콘솔 모드를 가지고 오는 함수

SetConsoleMode : 콘솔 모드를 적용하는 함수

입니다.

 

/// <summary>
/// 애플리케이션 핸들을 가지고 온다.
/// </summary>
/// <param name="nStdHandle"></param>
/// <returns></returns>
[DllImport("kernel32.dll", SetLastError = true)]
public static extern IntPtr GetStdHandle(int nStdHandle);
 
/// <summary>
/// 콘솔 모드를 가지고 온다.
/// </summary>
/// <param name="hConsoleHandle"></param>
/// <param name="lpMode"></param>
/// <returns></returns>
[DllImport("kernel32.dll", SetLastError = true)]
public static extern bool GetConsoleMode(IntPtr hConsoleHandle, out uint lpMode);
/// <summary>
/// 콘솔모드를 설정한다.
/// </summary>
/// <param name="hConsoleHandle"></param>
/// <param name="dwMode"></param>
/// <returns></returns>
[DllImport("kernel32.dll", SetLastError = true)]
public static extern bool SetConsoleMode(IntPtr hConsoleHandle, uint dwMode);

 

 

2-2. '시스템 입력' 끄기

'GetStdHandle'를 이용하여 수정할 콘솔의 핸들을 받아옵니다.

IntPtr consoleHandle = GetStdHandle(-10);

여기서 '-10'은 'STD_INPUT_HANDLE'을 의미합니다.

(참고 : MS Learn - GetStdHandle 함수 )

 

 

핸들로 콘솔 모드를 받아옵니다.

//핸들에 설정된 콘솔 모드를 가지고 온다.
UInt32 consoleMode;
GetConsoleMode(consoleHandle, out consoleMode);

 

'시스템 입력'의 'uint'값은 '0x0001'입니다.

이 옵션을 빼기 위해 다음과 같이 연산합니다.

consoleMode &= ~((uint)0x0001);

 

수정한 콘솔 모드를 적용합니다.

SetConsoleMode(consoleHandle, consoleMode);

 

이제 'F11'을 눌러도 전체화면이 되지 않습니다.

 

 

3. 캡슐화된 클래스 이용

제가 만든 클래스를 이용하여 간단하게 처리할 수 있습니다.

참고 : dang-gun/DotNetSamples/ConsoleModeSettingTest/ConsoleWindowSetting.cs

 

//시스템 입력 - 끄기
ConsoleWindow.F11Key(false);

//시스템 입력 - 켜기
ConsoleWindow.F11Key(true);

 

 

마무리

'F11'만 딱 막을 수 있으면 더 좋겠지만.....

대부분 이쯤 되면 '시스템 입력'이 필요 없는 상황이겠죠?

ㅎㅎㅎㅎ