导入SetCtrlHandlerHandler API
1 //定义处理程序委托 2 public delegate bool ConsoleCtrlDelegate(int ctrlType); 3 //导入SetCtrlHandlerHandler API 4 [DllImport("kernel32.dll")] 5 private static extern bool SetConsoleCtrlHandler(ConsoleCtrlDelegate HandlerRoutine, bool Add); 6 //当用户关闭Console时,系统会发送次消息 7 private const int CTRL_CLOSE_EVENT = 2; 8 //Ctrl+C,系统会发送次消息 9 private const int CTRL_C_EVENT = 0; 10 //Ctrl+break,系统会发送次消息 11 private const int CTRL_BREAK_EVENT = 1; 12 //用户退出(注销),系统会发送次消息 13 private const int CTRL_LOGOFF_EVENT = 5; 14 //系统关闭,系统会发送次消息 15 private const int CTRL_SHUTDOWN_EVENT = 6;
这是对事件处理的方法,后面SetCtrlHandlerHandler会进行调用
1 //处理程序例程,在这里编写对指定事件的处理程序代码注意:在VS中调试执行时,在这里设置断点,但不会中断;会提示:无可用源 2 private static bool HandlerRoutine(int ctrlType) 3 { 4 Console.WriteLine(ctrlType); 5 switch (ctrlType) 6 { 7 case CTRL_C_EVENT: 8 Console.WriteLine("C"); 9 return true; //这里返回true,表示阻止响应系统对该程序的操作 10 //break; 11 case CTRL_BREAK_EVENT: 12 Console.WriteLine("BREAK"); 13 return true; 14 case CTRL_CLOSE_EVENT: 15 Console.WriteLine("CLOSE"); 16 return true; 17 case CTRL_LOGOFF_EVENT: 18 Console.WriteLine("LOGOFF"); 19 return true; 20 case CTRL_SHUTDOWN_EVENT: 21 Console.WriteLine("SHUTDOWN"); 22 return true; 23 } 24 //return true;//表示阻止响应系统对该程序的操作 25 return false;//忽略处理,让系统进行默认操作 26 }
核心代码是位于类的构造函数中
1 public Program() 2 { 3 ConsoleCtrlDelegate consoleDelegete = new ConsoleCtrlDelegate(HandlerRoutine); 4 bool bRet = SetConsoleCtrlHandler(consoleDelegete, true); 5 if (bRet == false) //安装事件处理失败 6 { 7 Console.WriteLine("error"); 8 while (true) 9 { 10 Console.WriteLine("..."); 11 Thread.Sleep(1000); 12 } 13 } 14 else 15 { 16 Console.WriteLine("ok"); 17 while (true) 18 { 19 Console.WriteLine("..."); 20 Thread.Sleep(1000); 21 } 22 } 23 }
控制台主函数入口处调用方法
1 static void Main(string[] args) 2 { 3 Program cls = new Program(); 4 //Console.ReadKey(); 5 }
参考:SetConsoleCtrlHandler 处理控制台消息、SetConsoleCtrlHandler