2010-07-23 53 views
1

我一直在玩java和php(从头开始)一些ANSI的东西(如颜色等),我试图找到一种方式来基本上等待按键。我想我的主事件循环的末尾有类似下面的伪代码:有没有办法等待并从(远程)终端会话中获取按键?

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

但一切我一直在努力,在过去几天失败,因为键仅在标准输入变得可用在用户按下输入之后。

这没有多大意义的,你回答什么语言,但javaphp,普通的旧cc#将是最好的,因为我需要它移植到那些所有四个我不能使用任何真正漂亮的图书馆的东西语言...我需要这个工作通过telnetssh连接,但我的研究表明,除非你在本地机器上工作,否则这是不可能的。

请证明我是错的。

回答

2

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

当程序死机并离开终端在cbreak模式时,您通常可以使用stty sanereset使终端回到合理的状态。

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

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

+0

谢谢,这听起来很有用。我肯定会在周末检查一下! – Kris 2010-07-23 07:07:33

+0

到目前为止,运气不好,因为诅咒是一个我不能(也不想)依赖的图书馆,我无法弄清楚它是如何通过阅读来源的诅咒。 (我不想学习C++只是为了解决这个问题) – Kris 2010-07-23 21:59:25

1

我知道,这是一个古老的线程,但我无法在其他地方找到合适的答案。所以,从我公司的高级程序员一些帮助我想出了这一点:

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

的部分阅读尽量广泛可用解决了我的问题,多次使用时,“System.in.read() “独自并不总是等待。

对于我这样做的伎俩,我用这样的:

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

希望它能帮助。

亲切的问候, 拉尔夫

+0

虽然这不能解决我的问题(我不想等待一个键被按下),这可能对其他人访问此线程有用。 – Kris 2011-10-15 08:44:56

相关问题