1

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

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

但是过去几天我一直在尝试的一切都失败了,因为按键只有在用户按下回车后才能在 STDIN 上可用。

你用什么语言回答并不重要,但是java,,php普通旧的c或者c#最好的,我不能使用任何真正漂亮的库东西,因为我需要将它移植到所有这四种语言......我需要这个通过telnetssh连接工作,但到目前为止我的研究表明,除非您在本地计算机上工作,否则这是不可能的。

请证明我错了。

4

2 回答 2

2

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

当您的程序终止并离开终端cbreak模式时,您通常可以使用stty sanereset将终端恢复到合理状态。

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

在 C 中,您可以使用ioctl(2)终端设备上的调用来打开 cbreak 模式,也可以使用 curses。有关详细信息,请参见ncurses(3)手册页。

于 2010-07-23T05:45:38.350 回答
1

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

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

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

对我来说,这可以解决问题,我像这样使用它:

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

希望能帮助到你。

亲切的问候,拉尔夫

于 2011-10-14T11:48:08.837 回答