■ 콘솔(Console) 프로그램 CTRL+C 종료시 처리하기

------------------------------------------------------------------------------------------------------------------------


TestProject.zip


Program.cs

 

 

using System;

using System.Runtime.InteropServices;

 

namespace TestProject

{

    /// <summary>

    /// 프로그램

    /// </summary>

    class Program

    {

        //////////////////////////////////////////////////////////////////////////////////////////////////// Delegate

        ////////////////////////////////////////////////////////////////////////////////////////// Public

 

        #region 핸들러 루틴 대리자 - HandlerRoutineDelegate(controlType)

 

        /// <summary>

        /// 핸들러 루틴 대리자

        /// </summary>

        /// <param name="controlType">컨트롤 타입</param>

        /// <returns>처리 결과</returns>

        public delegate bool HandlerRoutineDelegate(ControlType controlType);

 

        #endregion

 

        //////////////////////////////////////////////////////////////////////////////////////////////////// Import

        ////////////////////////////////////////////////////////////////////////////////////////// Static

        //////////////////////////////////////////////////////////////////////////////// Private

 

        #region 콘솔 컨트롤 핸들러 처리하기 - SetConsoleCtrlHandler(handler, add);

 

        /// <summary>

        /// 콘솔 컨트롤 핸들러 처리하기

        /// </summary>

        /// <param name="handler">핸들러</param>

        /// <param name="add">추가 여부</param>

        /// <returns>처리 결과</returns>

        [DllImport("Kernel32")]

        private static extern bool SetConsoleCtrlHandler(HandlerRoutineDelegate handler, bool add);

 

        #endregion

 

        //////////////////////////////////////////////////////////////////////////////////////////////////// Method

        ////////////////////////////////////////////////////////////////////////////////////////// Static

        //////////////////////////////////////////////////////////////////////////////// Private

 

        #region 프로그램 시작하기 - Main()

 

        /// <summary>

        /// 프로그램 시작하기

        /// </summary>

        private static void Main()

        {

            Console.Title = "콘솔(Console) 프로그램 CTRL+C 종료시 처리하기";

 

            AppDomain.CurrentDomain.ProcessExit += AppDomain_ProcessExit;

 

            SetConsoleCtrlHandler(new HandlerRoutineDelegate(HandlerRoutine), true);

 

            Console.ReadKey(false);

        }

 

        #endregion

 

        #region 앱 도메인 프로세스 종료시 처리하기 - AppDomain_ProcessExit(sender, e)

 

        /// <summary>

        /// 앱 도메인 프로세스 종료시 처리하기

        /// </summary>

        /// <param name="sender">이벤트 발생자</param>

        /// <param name="e">이벤트 인자</param>

        private static void AppDomain_ProcessExit(object sender, EventArgs e)

        {

            Console.WriteLine("APP DOMAIN PROCESS EXIT");

        }

 

        #endregion

 

        #region 핸들러 루틴 처리하기 - HandlerRoutine(controlType)

 

        /// <summary>

        /// 핸들러 루틴 처리하기

        /// </summary>

        /// <param name="controlType">컨트롤 타입</param>

        /// <returns>처리 결과</returns>

        private static bool HandlerRoutine(ControlType controlType)

        {

            switch(controlType)

            {

                case ControlType.CTRL_C_EVENT :

                

                    Console.WriteLine("CTRL+C RECEIVED");

 

                    break;

 

                case ControlType.CTRL_BREAK_EVENT :

 

                    Console.WriteLine("CTRL+BREAK RECEIVED");

 

                    break;

 

                case ControlType.CTRL_CLOSE_EVENT :

 

                    Console.WriteLine("PROGRAM BEING CLOSED");

 

                    break;

 

                case ControlType.CTRL_LOGOFF_EVENT   :

                case ControlType.CTRL_SHUTDOWN_EVENT :

 

                    Console.WriteLine("USER IS LOGGING OFF");

 

                    break;

            }

 

            return true;

        }

 

        #endregion

    }

}

 

------------------------------------------------------------------------------------------------------------------------

Posted by 사용자 icodebroker
TAG

댓글을 달아 주세요