2022. 10. 4. 15:30

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

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

 

연관글 영역

 

 

1. 증상

콘솔 애플리케이션(console application)에서 콘솔 창을 클릭하거나 드래그하면 응용프로그램이 멈추는 현상 있습니다.

 

이것은 '빠른 편집 모드(Quick Edit Mode)'가 활성화 되어 있기 때문입니다.

 

 

2. 해결

'WinAPI'를 이용하여 '빠른 편집 모드'를 꺼주면 됩니다.

 

'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'값은 '0x0040'입니다.

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

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

 

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

SetConsoleMode(consoleHandle, consoleMode);

 

이제 클릭해도 멈추지 않습니다.

편집모드를 사용하려면 

오른쪽 클릭 > 표시

를 선택하여 편집 모드를 활성화 해야 합니다.

 

 

3. 캡슐화된 클래스 이용

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

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

 

//빠른 편집 모드 - 끄기
ConsoleWindow.QuickEditMode(false);

//빠른 편집 모드 - 켜기
ConsoleWindow.QuickEditMode(true);

 

마무리

윈도우 콘솔 기본값 그대로 따라가는 거겠죠?