Есть ли способ подождать и получить нажатие клавиши из (удаленного) сеанса терминала? - PullRequest
1 голос
/ 23 июля 2010

Я поигрался с некоторыми вещами ANSI (такими как цвета и т. Д.) В java и php (с нуля), и я пытаюсь найти способ в основном ждать нажатия клавиши.Я хотел бы иметь что-то вроде следующего псевдокода в конце моего основного цикла событий:

If (KeyPressed)
Begin
    var event = new KeyboardEvent();
        event.Key = ReadKey();
    this.BubbleEvent(event);
End

Но все, что я пробовал в течение последних нескольких дней, терпит неудачу, потому что нажатия клавиш становятся доступными толькона STDIN после того, как пользователь нажал enter.

Неважно, на каком языке вы отвечаете, но java, php, обычный старый c или c# будет лучше, иЯ не могу использовать какие-либо действительно изящные библиотечные вещи, потому что мне нужно перенести их на все четыре из этих языков ... Мне нужно, чтобы это работало через соединение telnet или ssh, но мои исследования до сих пор показывают, что это невозможно, если выРаботаем на местной машине.

Пожалуйста, докажите, что я не прав.

Ответы [ 2 ]

2 голосов
/ 23 июля 2010

Функция curses cbreak(3) отключит буферизацию строки и обработку стирания / уничтожения. Вы можете сделать это самостоятельно с помощью stty(1), если действительно хотите.

Когда ваша программа умирает и покидает терминал в режиме cbreak, вы обычно можете использовать stty sane или reset, чтобы вернуть терминал в разумное состояние.

Изнутри Perl вы можете использовать модуль Term::ReadKey или Curses для управления терминалом. Подробнее см. Справочную страницу Term::ReadKey(3pm) или Curses(3pm).

Изнутри C вы можете использовать либо ioctl(2) вызовы на терминальном устройстве для включения режима cbreak, либо вы можете использовать curses. Подробнее см. Справочную страницу ncurses(3).

1 голос
/ 14 октября 2011

Я знаю, это старая ветка, но я не мог найти подходящий ответ где-либо еще.Поэтому с некоторой помощью старших программистов моей компании я придумал следующее:

private void waitKeypress() throws IOException
{
    System.in.read();
    while ( System.in.available() > 0 ) 
    {
        System.in.read();
    }
}

Чтение части, имеющей столько информации, сколько доступно, решило мою проблему, которая при многократном использовании "System.in.read() "один не всегда ждет.

Для меня это делает трюк, я использую его так:

doSomething();
waitKeypress();
doNextThing();

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

С уважением,Ральф

...