반응형

 

코드를 디버깅할 때 콘솔(console)창을 자주 애용합니다.

한 때, 무의식적으로 콘솔창에 클릭하거나 드래그한 것도 모르는 채로 중간에 멈추는 현상을 경험한 적이 있습니다.

실수를 모르고 간헐적으로 장애를 발생하는구나 하면서 버그를 찾을려는 헛수고를 한 적이 있었습니다.

이를 방지하고자 콘솔창 마우스 드래그, 키보드 입력을 비활성화를 할 수 있는 코드를 알려드립니다.


 

# 개발 환경

운영체제 : Windows 10 Pro 64bit

개발도구 : Visual Studio 2013 Professional


 

# 사용한 API

#include <consoleapi.h>

HANDLE WINAPI GetStdHandle(
  DWORD nStdHandle
);


BOOL WINAPI GetConsoleMode(
  _In_  HANDLE  hConsoleHandle,
  _Out_ LPDWORD lpMode
);


BOOL WINAPI SetConsoleMode(
  _In_ HANDLE hConsoleHandle,
  _In_ DWORD  dwMode
);

 

# 문제점

(왼쪽) 마우스 클릭한 경우

(오른쪽) 마우스 드래그한 경우


 

# 전체 예제 소스

- main함수에서 Console Handle을 받아 Console 설정

#include <stdio.h>
#include <consoleapi.h>

int main(void)
{
    DWORD consoleModePrev;
    HANDLE handle = GetStdHandle(STD_INPUT_HANDLE);
    GetConsoleMode(handle, &consoleModePrev);
    SetConsoleMode(handle, consoleModePrev & ~ENABLE_QUICK_EDIT_MODE);

    int count = 0;
    while(1){
        printf("counting : %d\n", count++);
        Sleep(1000);
    }

    return 1;
}

 

# 단위 분석

int main

DWORD consoleModePrev;
HANDLE handle = GetStdHandle(STD_INPUT_HANDLE);
GetConsoleMode(handle, &consoleModePrev);
SetConsoleMode(handle, consoleModePrev & ~ENABLE_QUICK_EDIT_MODE);
  • GetStdHandle : 콘솔 입력 버퍼(STD_INPUT_HANDLE) 에서 읽거나 쓸 수 있는 핸들 반환
  • GetConsoleMode : 핸들로 통해서 설정된 콘솔 모드를 consoleModePrev 에 저장
  • SetConsoleMode : 콘솔 화면 버퍼(handle)의 출력 모드를 마우스/키보드 미입력모드(~ENABLE_QUICK_EDIT_MODE)로 이전 모드(consoleModePrev)와 AND 연산으로 설정

 


감사합니다.

 

잘못된 정보나 오타 및 수정사항이 있을 경우 댓글로 달아주시면 감사하겠습니다. 

 


반응형

+ Recent posts