我一直在玩java和php(从头开始)中的一些ANSI东西(比如颜色等),我正试图找到一种基本上等待按键的方法。我想在主事件循环结束时使用以下伪代码:
If (KeyPressed)
Begin
var event = new KeyboardEvent();
event.Key = ReadKey();
this.BubbleEvent(event);
End
但过去几天我一直在尝试的所有事情都失败了,因为只有在用户按下回车键后,按键才会在STDIN上显示。
你回答的语言并不重要,但是java
,php
,普通的c
或c#
会是最好的,我不能使用任何语言非常漂亮的图书馆资料,因为我需要把它移植到所有这四种语言......我需要这个来处理telnet
或ssh
连接,但到目前为止,我的研究表明除非你这样做是不可能的'正在使用本地机器。
请证明我错了。
答案 0 :(得分:2)
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 :(得分:1)
我知道,这是一个老线程,但我在其他地方找不到合适的答案。因此,在我公司的高级程序员的帮助下,我想出了这个:
private void waitKeypress() throws IOException
{
System.in.read();
while ( System.in.available() > 0 )
{
System.in.read();
}
}
读取尽可能多的输入的部分解决了我的问题,当多次使用时,“System.in.read()”并不总是等待。
对我来说这就是诀窍,我这样用它:
doSomething();
waitKeypress();
doNextThing();
希望它有所帮助。
亲切的问候, 拉尔夫