[.NET] 콘솔 애플리케이션(console application)에서 'F11(전체 화면 전환)' 막기
다른 포스팅에서 한번 다룬 내용이지만
그 포스팅은 종합적인 내용이라 검색하기 좋게 분리한 내용입니다.
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'만 딱 막을 수 있으면 더 좋겠지만.....
대부분 이쯤 되면 '시스템 입력'이 필요 없는 상황이겠죠?
ㅎㅎㅎㅎ