CTRL-Cのトラップ

CではCTRL-Cをトラップするのにsignal関数を使ったりしましたが、.NET2.0ではConsoleクラスでサポートしてくれるようになりました。

using System;

class Program
{
    static void Main(string[] args)
    {
        // CancelKeyPressイベントを登録
        Console.CancelKeyPress += delegate(object o, ConsoleCancelEventArgs e)
        {
            Console.WriteLine("CTRL-C");
            e.Cancel = true;    // プロセスを終了させない
        };

        for (int i = 0; i < 10; ++i) {
            Console.WriteLine(DateTime.Now);
            System.Threading.Thread.Sleep(1000);
        }
        Console.WriteLine("Exit");
        Console.ReadLine();
    }
}

/* 結果
2004/07/25 17:58:27
2004/07/25 17:58:28
CTRL-C
2004/07/25 17:58:29
2004/07/25 17:58:30
CTRL-C
2004/07/25 17:58:31
2004/07/25 17:58:32
2004/07/25 17:58:33
CTRL-C
2004/07/25 17:58:34
2004/07/25 17:58:35
2004/07/25 17:58:36
Exit
 */

また、単にCTRL-Cで終了させたくないだけでしたら、

Console.TreatControlCAsInput = true;

とすれば、CTRL-Cも単なるキー入力扱いとなります。

ちなみに、.NET1.1でCTRL-Cをトラップするには、SetConsoleCtrlHandlerをP/Invokeすることになります。詳細はMore tips from Sairama - Catching Ctrl-C from a .NET Console Applicationが参考になると思います。