SetConsoleCtrlHandler 함수

호출 프로세스에 대한 처리기 함수 목록에서 애플리케이션 정의 HandlerRoutine 함수를 추가하거나 제거합니다.

처리기 함수가 지정되지 않은 경우 함수는 호출 프로세스에서 CTRL+C 신호를 무시하는지 여부를 결정하는 상속 가능한 특성을 설정합니다.

구문

BOOL WINAPI SetConsoleCtrlHandler(
  _In_opt_ PHANDLER_ROUTINE HandlerRoutine,
  _In_     BOOL             Add
);

매개 변수

HandlerRoutine [in, optional]
추가하거나 제거할 애플리케이션 정의 HandlerRoutine 함수에 대한 포인터입니다. 이 매개 변수는 NULL일 수 있습니다.

Add [in]
이 매개 변수가 TRUE이면 처리기가 추가되고, FALSE이면 처리기가 제거됩니다.

HandlerRoutine 매개 변수가 NULL인 경우 TRUE 값은 호출 프로세스에서 CTRL+C 입력을 무시하도록 하고, FALSE 값은 CTRL+C 입력의 정상적인 처리를 복원합니다. CTRL+C를 무시하거나 처리하는 이 특성은 자식 프로세스에 상속됩니다.

반환 값

함수가 성공하면 반환 값이 0이 아닙니다.

함수가 실패하면 반환 값은 0입니다. 확장 오류 정보를 가져오려면 GetLastError를 호출합니다.

설명

이 함수는 WM_QUERYENDSESSION에서 메시지 펌프를 사용하여 그래픽 애플리케이션에 제공하는 것과 비슷한 알림을 콘솔 애플리케이션 및 서비스에 제공합니다. 그래픽 애플리케이션에서 이 함수를 사용할 수도 있지만, WM_QUERYENDSESSION의 알림 이전에 도착한다고 보장하지는 않습니다.

각 콘솔 프로세스에는 CTRL+CCTRL+BREAK 신호를 처리하는 애플리케이션 정의 HandlerRoutine 함수의 고유한 목록이 있습니다. 또한 처리기 함수는 사용자가 콘솔을 닫거나 로그오프하거나 시스템을 종료할 때 시스템에서 생성된 신호를 처리합니다. 처음에는 각 프로세스의 처리기 목록에 ExitProcess 함수를 호출하는 기본 처리기 함수만 포함됩니다. 콘솔 프로세스는 다른 프로세스의 처리기 함수 목록에 영향을 주지 않는 SetConsoleCtrlHandler 함수를 호출하여 추가 처리기 함수를 추가하거나 제거합니다. 콘솔 프로세스에서 제어 신호를 받으면 처리기 중 하나에서 TRUE를 반환할 때까지 해당 처리기 함수가 마지막으로 등록된 첫 번째 호출 기준으로 호출됩니다. TRUE를 반환하는 처리기가 없으면 기본 처리기가 호출됩니다.

AttachConsole, AllocConsole 또는 FreeConsole을 호출하면 클라이언트 프로세스의 제어 처리기 테이블이 초기 상태로 재설정됩니다. 연결된 콘솔 세션이 변경되면 처리기를 다시 등록해야 합니다.

콘솔 프로세스의 경우 CTRL+CCTRL+BREAK 키 조합은 일반적으로 신호(CTRL_C_EVENTCTRL_BREAK_EVENT)로 처리됩니다. 키보드 포커스가 있는 콘솔 창에서 CTRL+C 또는 CTRL+BREAK를 받으면 신호가 일반적으로 해당 콘솔을 공유하는 모든 프로세스에 전달됩니다.

CTRL+BREAK는 항상 신호로 처리되지만, 처리기 함수가 호출되지 않도록 하는 다음 세 가지 방법으로 일반적인 CTRL+C 동작을 변경할 수 있습니다.

  • SetConsoleMode 함수는 콘솔의 입력 버퍼에 대해 ENABLE_PROCESSED_INPUT 모드를 사용하지 않도록 설정할 수 있으므로 CTRL+C 신호가 아닌 키보드 입력으로 보고됩니다.
  • NULLTRUE 인수를 사용하여 SetConsoleCtrlHandler를 호출하면 호출 프로세스에서 CTRL+C 신호를 무시합니다. 이 특성은 자식 프로세스에서 상속되지만, 기존 프로세스에 영향을 주지 않고 모든 프로세스에서 사용하거나 사용하지 않도록 설정할 수 있습니다.
  • 콘솔 프로세스가 디버그되고 CTRL+C 신호가 사용하지 않도록 설정되지 않은 경우 시스템에서 DBG_CONTROL_C 예외를 생성합니다. 이 예외는 디버거를 위해서만 발생하며, 애플리케이션에서 예외 처리기를 사용하여 처리하면 안 됩니다. 디버거에서 예외를 처리하는 경우 애플리케이션은 CTRL+C를 인식하지 못합니다. 단, 경고 가능한 대기가 종료됩니다. 디버거에서 예외를 처리되지 않은 상태로 전달하는 경우 앞에서 설명한 대로 CTRL+C가 콘솔 프로세스에 전달되고 신호로 처리됩니다.

콘솔 프로세스는 GenerateConsoleCtrlEvent 함수를 사용하여 CTRL+C 또는 CTRL+BREAK 신호를 콘솔 프로세스 그룹에 보낼 수 있습니다.

사용자가 콘솔을 닫거나 로그오프하거나 시스템을 종료할 때 프로세스에서 종료 전에 정리할 수 있도록 시스템에서 CTRL_CLOSE_EVENT, CTRL_LOGOFF_EVENTCTRL_SHUTDOWN_EVENT 신호를 생성합니다. 콘솔 함수 또는 콘솔 함수를 호출하는 C 런타임 함수는 앞에서 언급한 세 가지 신호 중 하나를 처리하는 동안 안정적으로 작동하지 않을 수 있습니다. 이는 프로세스 신호 처리기를 실행하기 전에 내부 콘솔 정리 루틴의 일부 또는 전부가 호출되었을 수 있기 때문입니다.

Windows 7, Windows 8, Windows 8.1 및 Windows 10:

콘솔 애플리케이션에서 gdi32.dll 또는 user32.dll 라이브러리를 로드하는 경우 SetConsoleCtrlHandler를 호출할 때 지정하는 HandlerRoutine 함수는 CTRL_LOGOFF_EVENTCTRL_SHUTDOWN_EVENT 이벤트에 대해 호출되지 않습니다. 운영 체제는 gdi32.dll 또는 user32.dll을 콘솔 애플리케이션이 아닌 Windows 애플리케이션으로 로드하는 프로세스를 인식합니다. 또한 이 동작은 gdi32.dll 또는 user32.dll의 함수를 직접 호출하지 않지만 gdi32.dll 또는 user32.dll의 함수를 차례로 호출하는 Shell 함수와 같은 함수를 호출하는 콘솔 애플리케이션에서도 발생합니다.

이러한 상황에서 사용자가 로그아웃하거나 디바이스가 종료될 때 이벤트를 받으려면 숨겨진 창을 콘솔 애플리케이션에 만든 다음, 숨겨진 창에서 받는 WM_QUERYENDSESSIONWM_ENDSESSION 창 메시지를 처리합니다. 숨겨진 창은 dwExStyle 매개 변수가 0으로 설정된 CreateWindowEx 메서드를 호출하여 만들 수 있습니다. 이에 대한 예는 아래에 링크된 기본 처리기 예제에 포함되어 있습니다.

예제

예제는 제어 처리기 함수 등록을 참조하세요.

요구 사항

   
지원되는 최소 클라이언트 Windows 2000 Professional[데스크톱 앱만]
지원되는 최소 서버 Windows 2000 Server[데스크톱 앱만]
헤더 ConsoleApi.h(WinCon.h를 통해, Windows.h 포함)
라이브러리 Kernel32.lib
DLL Kernel32.dll
유니코드 및 ANSI 이름

참고 항목

콘솔 컨트롤 처리기

콘솔 함수

ExitProcess

GenerateConsoleCtrlEvent

GetConsoleMode

HandlerRoutine

SetConsoleMode