--- lang: ja-jp breaks: true --- # C#コンソールアプリで `Ctrl+C`(SIGINT)をトラップする方法 2021-07-22 > Console.CancelKeyPress Event > https://docs.microsoft.com/en-us/dotnet/api/system.console.cancelkeypress?redirectedfrom=MSDN&view=net-5.0 ```csharp= using (CancellationTokenSource cancellationTokenSource = new()) { Console.CancelKeyPress += (o, a) => { if (a.SpecialKey == ConsoleSpecialKey.ControlC) { cancellationTokenSource.Cancel(); }; Console.WriteLine($"{a.Cancel} {a.SpecialKey}"); }; ・・・ } ``` ```csharp= using System; class Sample { public static void Main() { ConsoleKeyInfo cki; Console.Clear(); // Establish an event handler to process key press events. Console.CancelKeyPress += new ConsoleCancelEventHandler(myHandler); while (true) { Console.Write("Press any key, or 'X' to quit, or "); Console.WriteLine("CTRL+C to interrupt the read operation:"); // Start a console read operation. Do not display the input. cki = Console.ReadKey(true); // Announce the name of the key that was pressed . Console.WriteLine($" Key pressed: {cki.Key}\n"); // Exit if the user pressed the 'X' key. if (cki.Key == ConsoleKey.X) break; } } protected static void myHandler(object sender, ConsoleCancelEventArgs args) { Console.WriteLine("\nThe read operation has been interrupted."); Console.WriteLine($" Key pressed: {args.SpecialKey}"); Console.WriteLine($" Cancel property: {args.Cancel}"); // Set the Cancel property to true to prevent the process from terminating. Console.WriteLine("Setting the Cancel property to true..."); args.Cancel = true; // Announce the new value of the Cancel property. Console.WriteLine($" Cancel property: {args.Cancel}"); Console.WriteLine("The read operation will resume...\n"); } } // The example displays output similar to the following: // Press any key, or 'X' to quit, or CTRL+C to interrupt the read operation: // Key pressed: J // // Press any key, or 'X' to quit, or CTRL+C to interrupt the read operation: // Key pressed: Enter // // Press any key, or 'X' to quit, or CTRL+C to interrupt the read operation: // // The read operation has been interrupted. // Key pressed: ControlC // Cancel property: False // Setting the Cancel property to true... // Cancel property: True // The read operation will resume... // // Key pressed: Q // // Press any key, or 'X' to quit, or CTRL+C to interrupt the read operation: // Key pressed: X ``` ###### tags: `C#` `コンソール` `Ctrl+C` `SIGINT` `Console` `キャンセル` `Cancel` `CancellationTokenSource`