C # .NET Core Console.ReadKey (true) не (всегда) перехватывает ключ в Ubuntu - PullRequest
2 голосов
/ 25 июня 2019

Я работаю над своими первыми приложениями .NET Core и, чтобы опробовать их кроссплатформенную функциональность, я настроил Ubuntu VM. После установки .NET я переместил свои файлы на виртуальную машину и запустил программу. В основном все работает отлично - за одним исключением.

Когда я использую Console.ReadKey(true);, я должен получить нажатую клавишу, но консоль не должна показывать это. В Windows работает нормально, клавиша нажата и ничего не отображается. Но в Ubuntu консоль по-прежнему показывает клавиши, которые я нажимаю.

Итак, как я могу предотвратить это? Похоже, что показанный символ увеличивается со сложностью моей программы, больше времени между вызовами Console.ReadKey(true); означает больше отображаемых символов.

Надеюсь, ты поможешь мне, Нильс.

Код:

namespace test
{
    class Program
    {
        static void Main(string[] args)
        {
            long lastrun = DateTime.Now.Ticks;
            while (!PressedESC())
            {
                if (DateTime.Now.Ticks >= (lastrun + (TimeSpan.TicksPerSecond * 5)))
                {
                    lastrun = DateTime.Now.Ticks;
                    // Here could be some dataprocessing but its not needed here...
                    // The problem already occures with this code.
                }
            }
        }

        private static bool PressedESC()
        {
            return Console.KeyAvailable && Console.ReadKey(true).Key == ConsoleKey.Escape;
        }
    }
}

-> Показаны только несколько быстро набираемых символов

using System;
using System.Threading;

namespace test
{
    class Program
    {
        static void Main(string[] args)
        {
            long lastrun = DateTime.Now.Ticks;
            while (!PressedESC())
            {
                if (DateTime.Now.Ticks >= (lastrun + (TimeSpan.TicksPerSecond * 5)))
                {
                    lastrun = DateTime.Now.Ticks;
                    // Here could be some dataprocessing but its not needed here...
                    // The problem already occures with this code.
                }
                Thread.Sleep(50);
            }
        }

        private static bool PressedESC()
        {
            return Console.KeyAvailable && Console.ReadKey(true).Key == ConsoleKey.Escape;
        }
    }
}

-> Отображается каждый тип символа I.

Что я пробовал:
- Ubuntu 18.04 LTS (Desktop) (VM) Terminal
- Ubuntu 18.04 LTS (Desktop) (VM) Gnome Terminal
- Ubuntu 18.04 LTS (Сервер) (VM) Терминал
- Ubuntu 18.04 LTS (Сервер) (VM) PuTTY (из Windows)
Результат всегда один и тот же.

1 Ответ

0 голосов
/ 26 июня 2019

Не совсем понятно, чего вы пытаетесь достичь. Почему бы не это вместо этого?

class Program
{
    static void Main(string[] args)
    {
        while (Console.ReadKey(true).Key != ConsoleKey.Escape) {}
    }
}

Это работает для меня в Ubuntu 18.04.

(Обратите внимание, что некоторые символы могут по-прежнему печататься на экране, если вы нажимаете на клавиатуру во время инициализации приложения. Требуется некоторое время для инициализации и компиляции кода во время выполнения, прежде чем ввод может быть перехвачен. Как только программа работает, однако все входы должны быть зафиксированы.)

...