Клавиша перехвата клавиатуры нажимает в док-контейнер - PullRequest
0 голосов
/ 03 октября 2019

Я пытаюсь поместить консольное приложение в докер-контейнер, и необходимо поймать нажатие клавиши со стрелкой на клавиатуре.

Код:

public static Direction ReadInputDirection()
{
    var key = Console.ReadKey(intercept: true);

    switch (key.Key)
    {
        case ConsoleKey.UpArrow:
            return Direction.Up;

        case ConsoleKey.DownArrow:
            return Direction.Down;

        case ConsoleKey.LeftArrow:
            return Direction.Left;

        case ConsoleKey.RightArrow:
            return Direction.Right;

        default:
            return Direction.Invalid;
    }
}

Кодвыше выдает следующее исключение:

Необработанное исключение: System.InvalidOperationException: Невозможно прочитать ключи, когда ни одно из приложений не имеет консоли или когда ввод с консоли был перенаправлен. Попробуйте Console.Read. в System.ConsolePal.ReadKey (логический перехват) в SnakeGame.Control.ReadInputDirection ()

Я использую следующую команду для запуска контейнера, где snake-game - это имя изображения.

docker run -i --name snake-game snake-game

Есть ли способ обойти эту проблему?

1 Ответ

0 голосов
/ 05 октября 2019

Вам необходимо передать флаг -t в дополнение к -i в docker run:

-t              : Allocate a pseudo-tty

Это еще один способ сказать «присоединить терминал к программе»». В документах достаточно ясно об этом:

Для интерактивных процессов (например, оболочки) вы должны использовать -i -t вместе, чтобы выделить tty для процесса контейнера. -i -t часто пишется -it, как вы увидите в следующих примерах.

Без терминала (он же tty) у программы нет возможности считывать ввод и ошибки, как вывидя.

...