在应用程序关闭时运行“终止”代码

时间:2013-12-14 02:36:47

标签: c#

我有一个只运行另一个程序并监视它的程序。

static void Main(string[] args)
{
    using (Process exeProc = Process.Start(getStartInfo()))
    {
        while (!exeProc.HasExited)
        {
            // does some stuff while the monitored program is still running
        }
    }

    // 
    Console.WriteLine("done");
}

当其他程序退出时,我的也是如此。

我希望相反的情况也是如此:我如何做到这一点,以便关闭我的程序也将终止我正在监控的进程?

1 个答案:

答案 0 :(得分:1)

已经有另一个问题链接到msdn上有一个有效答案的问题(我知道太多的间接)。 C# how to receive system close or exit events in a commandline application

我会在这里发布代码,因为它是首选的,只是因为我逐字逐句地获取此代码段,所以只想归功于它。

namespace Detect_Console_Application_Exit2
{
    class Program
    {
        private static bool isclosing = false;
        static void Main(string[] args)
        {
            SetConsoleCtrlHandler(new HandlerRoutine(ConsoleCtrlCheck), true);

            Console.WriteLine("CTRL+C,CTRL+BREAK or suppress the application to exit");
            while (!isclosing) ;

        }

        private static bool ConsoleCtrlCheck(CtrlTypes ctrlType)
        {
            // Put your own handler here
            switch (ctrlType)
            {
                case CtrlTypes.CTRL_C_EVENT:
                    isclosing = true;
                    Console.WriteLine("CTRL+C received!");
                    break;

                case CtrlTypes.CTRL_BREAK_EVENT:
                    isclosing = true;
                    Console.WriteLine("CTRL+BREAK received!");
                    break;

                case CtrlTypes.CTRL_CLOSE_EVENT:
                    isclosing = true;
                    Console.WriteLine("Program being closed!");
                    break;

                case CtrlTypes.CTRL_LOGOFF_EVENT:
                case CtrlTypes.CTRL_SHUTDOWN_EVENT:
                    isclosing = true;
                    Console.WriteLine("User is logging off!");
                    break;

            }
            return true;
        }



        #region unmanaged
        // Declare the SetConsoleCtrlHandler function
        // as external and receiving a delegate.

        [DllImport("Kernel32")]
        public static extern bool SetConsoleCtrlHandler(HandlerRoutine Handler, bool Add);

        // A delegate type to be used as the handler routine
        // for SetConsoleCtrlHandler.
        public delegate bool HandlerRoutine(CtrlTypes CtrlType);

        // An enumerated type for the control messages
        // sent to the handler routine.
        public enum CtrlTypes
        {
            CTRL_C_EVENT = 0,
            CTRL_BREAK_EVENT,
            CTRL_CLOSE_EVENT,
            CTRL_LOGOFF_EVENT = 5,
            CTRL_SHUTDOWN_EVENT
        }

        #endregion

    }
}
相关问题