有没有办法从(远程)终端会话等待并获得按键?

时间:2010-07-23 05:16:25

标签: console keyboard keypress telnet tty

我一直在玩java和php(从头开始)中的一些ANSI东西(比如颜色等),我正试图找到一种基本上等待按键的方法。我想在主事件循环结束时使用以下伪代码:

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

但过去几天我一直在尝试的所有事情都失败了,因为只有在用户按下回车键后,按键才会在STDIN上显示。

你回答的语言并不重要,但是javaphp,普通的cc#会是最好的,我不能使用任何语言非常漂亮的图书馆资料,因为我需要把它移植到所有这四种语言......我需要这个来处理telnetssh连接,但到目前为止,我的研究表明除非你这样做是不可能的'正在使用本地机器。

请证明我错了。

2 个答案:

答案 0 :(得分:2)

curses函数cbreak(3)将禁用行缓冲和擦除/终止处理。如果你真的想要,你可以用stty(1)自己做。

当您的程序死亡并且终端处于cbreak模式时,您通常可以使用stty sanereset将终端恢复到合理的状态。

在Perl中,您可以使用Term::ReadKeyCurses模块来操作终端。有关详细信息,请参阅Term::ReadKey(3pm)Curses(3pm)联机帮助页。

在C中,您可以使用终端设备上的ioctl(2)次呼叫打开cbreak模式,也可以使用curses。有关详细信息,请参阅ncurses(3)联机帮助页。

答案 1 :(得分:1)

我知道,这是一个老线程,但我在其他地方找不到合适的答案。因此,在我公司的高级程序员的帮助下,我想出了这个:

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

读取尽可能多的输入的部分解决了我的问题,当多次使用时,“System.in.read()”并不总是等待。

对我来说这就是诀窍,我这样用它:

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

希望它有所帮助。

亲切的问候, 拉尔夫