【IT168技术文档】
控制台程序足够简洁,但是,经常会点错而误关闭。而且,如果系统关闭,或者用户注销,这时候任务还没完成的话,前面的运算电费就白出了。
有没有办法和WinForm一样,对控制台的退出事件进行控制呢?有的!
引入下面的函数
委托HandlerRoutine,就是把函数的指针传递给系统API函数SetConsoleCtrlHandler。这是个典型的回调函数。1 public delegate bool HandlerRoutine(int dwCtrlType); 2 3 [DllImport("kernel32.dll", CharSet = CharSet.Auto)] 4 public static extern bool SetConsoleCtrlHandler(HandlerRoutine HandlerRoutine, bool add);
然后在Main方法中调用
Program p = new Program(); if (!SetConsoleCtrlHandler(p.HandlerRoutineMethod, true)) { Console.WriteLine("Unable to install event handler!\n"); } const int CTRL_C_EVENT = 0; const int CTRL_BREAK_EVENT = 1; const int CTRL_CLOSE_EVENT = 2; const int CTRL_LOGOFF_EVENT = 5; const int CTRL_SHUTDOWN_EVENT = 6; public bool HandlerRoutineMethod(int dwCtrlType) { Console.WriteLine(dwCtrlType.ToString()); switch (dwCtrlType) { case CTRL_C_EVENT: return true; case CTRL_BREAK_EVENT: return false; case CTRL_CLOSE_EVENT: Console.WriteLine("确实要退出程序么?如果需要退出,请输入'exit'。"); return true; case CTRL_LOGOFF_EVENT: //用户退出 return false; case CTRL_SHUTDOWN_EVENT: //系统关闭 return false; } return true; }