[英]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上可用。
用什么语言回答都没关系,但是java
, php
,普通的旧c
或c#
会是最好的,而且我不能使用任何真正漂亮的库东西,因为我需要将其移植到所有这四种语言...我需要它来通过telnet
或ssh
连接工作,但是到目前为止,我的研究表明,除非您在本地计算机上工作,否则这是不可能的。
请证明我错了。
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)
联机帮助页。
我知道,这是一个旧线程,但是在其他任何地方都找不到合适的答案。 因此,在我公司高级程序员的帮助下,我想到了:
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.