Windows环境下:
delegate bool ConsoleCtrlDelegate(int dwCtrlType);
const int CTRL_CLOSE_EVENT = 2;
[DllImport("kernel32.dll")]//动态加载Kernel32.dll系统文件
private static extern bool SetConsoleCtrlHandler(ConsoleCtrlDelegate HandlerRoutine, bool Add);//托管代码
static void Main(string[] args)
{
ConsoleCtrlDelegate newDelegate = new ConsoleCtrlDelegate(HandlerRoutine);
SetConsoleCtrlHandler(newDelegate, true);
}
static void HandlerRoutine(int CtrlType)
{
switch (CtrlType)
{
case CTRL_CLOSE_EVENT: //用户要关闭Console了
//退出事件
break;
default:
break;
}
}
Linux(VSCODE)环境下(捕获Ctrl-C退出事件):
static void Main(string[] args)
{
Console.CancelKeyPress += new ConsoleCancelEventHandler(myHandler);//注册退出事件
}
protected static void myHandler(object sender, ConsoleCancelEventArgs args)
{
//退出事件
Console.WriteLine("退出程序");
}
另一种捕获关闭事件:
static void Main(string[] args)
{
System.Runtime.Loader.AssemblyLoadContext.Default.Unloading+=(ctx)=>
{
System.Console.WriteLine("closing");
WaitThreadExit();
};
Console.WriteLine("Hello World!");
Console.ReadLine();
}
static void WaitThreadExit()
{
Console.WriteLine("我退出了");
}