5

Escが押されるまでコードを実行しようとしています。したがってReadKey、コンソールで使用しています

var input = Console.ReadKey();
do
{

} while (input.Key != ConsoleKey.Escape);

しかし、「ConsoleKey」では、「bool」では ConsoleKey を使用できないと書かれています。どうすれば修正できますか?または、代わりに何を使用しますか?

4

3 に答える 3

11

これを試して:

ConsoleKeyInfo input;
do
{
    input = Console.ReadKey();
} while (input.Key != ConsoleKey.Escape);
于 2013-12-30T19:19:39.923 に答える
6

従来の+ESCの代わりにキーを使用したい特別な理由はありますか?CTRLC

後者のイベントにフックすることができConsole.CancelKeyPressます。これは、コマンドライン インターフェイスの世界では標準です。

Console.ReadKey()これは、一部のループで問題になる可能性があります。この例を見てみましょう:

    using System.Threading;
    using System.Threading.Tasks;

    CancellationTokenSource cts;

    public void Run()
    {
        cts = new CancellationTokenSource();
        var task = new Task(DoSomething, cts.Token);

        task.Start();

        while (!task.IsCompleted)
        {
            var keyInput = Console.ReadKey(true);

            if (keyInput.Key == ConsoleKey.Escape)
            {
                Console.WriteLine("Escape was pressed, cancelling...");
                cts.Cancel();
            }
        }

        Console.WriteLine("Done.");
    }

    void DoSomething()
    {
        var count = 0;

        while (!cts.IsCancellationRequested)
        {
            Thread.Sleep(1000);
            count++;

            Console.WriteLine("Background task has ticked ({0}).", count.ToString());
        }
    }

これは、が押されるTaskのを待っている間、 を使用してバックグラウンド作業を行います。キャンセルは問題なく機能しますが、完了後にもう一度ESCスタックします(キャンセル)。Console.ReadKey()

などの Win32 API を使用してGetKeyboardState、代わりにキー コードを確認できます。これはブロックされていないためです。ただし、CancelKeyPress代わりにイベントを使用することをお勧めします ( CTRL+ C):

    void Console_CancelKeyPress(object sender, ConsoleCancelEventArgs e)
    {
        Console.WriteLine("Cancelling...");
        cts.Cancel();

        e.Cancel = true;    // Do not terminate immediately!
    }
于 2013-12-30T21:05:59.353 に答える
3
ConsoleKeyInfo input;
do
{
    input = Console.ReadKey();
} while (input.Key != ConsoleKey.Escape);

またはそれより短い

while (Console.ReadKey().Key != ConsoleKey.Escape){}
于 2013-12-30T19:19:24.173 に答える