Невозможно перехватить Ctrl + C в консольном приложении C # - PullRequest
4 голосов
/ 28 февраля 2012

У меня есть следующий код, который я пытаюсь использовать для перехвата Ctrl + C в консольном приложении:

    /// <summary>
    /// A driver program for testing 
    /// </summary>
    /// <param name="args">Arguments to the program</param>
    static void Main(string[] args)
    {
        var program = new Program();

        Console.Clear();
        Console.TreatControlCAsInput = false;
        Console.CancelKeyPress += program.OnCancelKeyPress;

        program.Run(args.FirstOrDefault() ?? "3.26.200.125");

        Console.WriteLine("Press any key to continue ...");
        Console.ReadKey();
    }

    /// <summary>
    /// Called when [cancel key press].
    /// </summary>
    /// <param name="sender">The sender.</param>
    /// <param name="e">The <see cref="System.ConsoleCancelEventArgs"/> instance containing the event data.</param>
    internal void OnCancelKeyPress(object sender, ConsoleCancelEventArgs e)
    {
        this.Continue = false;
        e.Cancel = true;
    }

Я уже проверил вопросы здесь и здесь , но по какой-то причине, когда я нажимаю Control + C, Visual Studio 2010 не попадает в мой обработчик в отладчик, я просто получаю экран «Исходный код недоступен» и возможность продолжить отладку, и все. У кого-нибудь есть идеи, почему я не вхожу в обработчик? Я уверен, что мне просто не хватает чего-то простого.

Ответы [ 3 ]

4 голосов
/ 28 февраля 2012

Очевидно, есть ошибка Обходной путь со страницы Connect :

Тем временем, чтобы обойти эту проблему, вы можете включить отладку в смешанном режиме. Затем, когда вы нажмете Ctrl-C и появится диалоговое окно с уведомлением о первом исключении Ctrl-C, нажмите «Продолжить». Затем вы должны достичь точки останова в вашем обработчике.

1 голос
/ 28 февраля 2012

Код ниже прекрасно работает для меня

using System;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.Clear();
            Console.WriteLine("Press X to quit");
            Console.TreatControlCAsInput = false;
            Console.CancelKeyPress += (s, ev) =>
                                          {
                                              Console.WriteLine("Ctrl+C pressed");
                                              ev.Cancel = true;
                                          };

            while (true)
                if (Console.ReadKey().Key == ConsoleKey.X)
                    break;
        }
    }
}

Надеюсь, это поможет!

0 голосов
/ 28 февраля 2012

При выходе из Main обработчик событий, который вы зарегистрировали с помощью Console.CancelKeyPress += program.OnCancelKeyPress, получает сборщик мусора. Затем, когда ОС пытается получить доступ к делегату, код для запуска отсутствует.

Вы должны объявить, что статический делегат запускается за пределами области действия Main, а затем назначить его в пределах Main, чтобы он оставался в области действия, когда ОС пытается вызвать его обратно.

...