繁体   English   中英

有没有办法等待(远程)终端会话中的按键?

[英]Is there a way to wait for and get a key press from a (remote) terminal session?

我一直在玩Java和php中的一些ANSI东西(如颜色等)(从头开始),我试图找到一种基本上等待按键的方法。 我想在主事件循环的结尾添加类似以下的伪代码:

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

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

用什么语言回答都没关系,但是javaphp ,普通的旧cc#会是最好的,而且我不能使用任何真正漂亮的库东西,因为我需要将其移植到所有这四种语言...我需要它来通过telnetssh连接工作,但是到目前为止,我的研究表明,除非您在本地计算机上工作,否则这是不可能的。

请证明我错了。

curses函数cbreak(3)将禁用行缓冲和擦除/杀死处理。 如果您确实需要,可以使用stty(1)自己执行此操作。

当程序死掉并使终端处于cbreak模式时,通常可以使用stty sanereset来使终端回到合理的状态。

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

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

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

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

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

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

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

希望能帮助到你。

亲切的问候,拉尔夫

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM