Этот код работает, чтобы поймать пользователя закрытия окна консоли:
using System;
using System.Runtime.InteropServices;
class Program {
static void Main(string[] args) {
handler = new ConsoleEventDelegate(ConsoleEventCallback);
SetConsoleCtrlHandler(handler, true);
Console.ReadLine();
}
static bool ConsoleEventCallback(int eventType) {
if (eventType == 2) {
Console.WriteLine("Console window closing, death imminent");
}
return false;
}
static ConsoleEventDelegate handler; // Keeps it from getting garbage collected
// Pinvoke
private delegate bool ConsoleEventDelegate(int eventType);
[DllImport("kernel32.dll", SetLastError = true)]
private static extern bool SetConsoleCtrlHandler(ConsoleEventDelegate callback, bool add);
}
Берегись ограничений. У вас есть, чтобы быстро ответить на это уведомление, у вас есть 5 секунд, чтобы выполнить задачу. Возьмите больше времени, и Windows будет убивать ваш код бесцеремонно. И ваш метод называется асинхронно на рабочем потоке, состояние программы совершенно непредсказуемо, поэтому, вероятно, потребуется блокировка. Убедитесь, что прерывание не может вызвать проблемы. Например, при сохранении состояния в файл сначала сделайте сначала сохранение во временном файле и используйте File.Replace().
У вас есть «ручное закрытие» означает, что пользователь нажимает на крест «закрыть окно» в правом верхнем углу окна консоли? –
Я подозреваю, что за вами стоит «On Exit» самой командной строки. Как только будет выполнен «основной» метод консольного приложения, он вышел из-под вас, и пользователю нужно нажать клавишу Enter, чтобы закрыть окно командной строки. –
@Martin. Да, вот что я имел в виду. Будет обновляться для уточнения. – BlueVoodoo