Ruby键盘事件处理

时间:2009-05-22 12:52:55

标签: windows ruby console-application keyboard-events curses

您好我正在使用curses开发一个小型控制台应用程序。

我有一个等待用户输入的主循环部分,它使用getstr函数,当然这等待用户按回车键。

我想捕捉上下和标签按键。我想这不能用getstr。

完成

任何人都知道如何做到这一点?

编辑:我尝试过使用STDIN.getc来阻止应用程序运行,并且getch没有捕获箭头键

编辑#2:即时通讯在Windows上尝试此代码。似乎Curses.getch适用于Linux,但在Windows上我没有为向上箭头发送密钥。

2 个答案:

答案 0 :(得分:3)

您需要设置tty的“cbreak”模式,以便立即获得按键。如果你不这样做,Unix终端处理系统将缓冲输入,直到收到换行符(即用户点击ENTER),然后输入将全部传递给进程。

这实际上不是Ruby-甚至是特定于curses的;这是所有应用程序在Unix tty中运行的方式。

尝试使用curses库cbreak()功能打开此模式。退出前请不要忘记致电nocbreak()将其关闭!

对于读取单个字符,STDIN.getc将返回该字符的ASCII码的Fixnum。很可能你会发现STDIN.read(1)更方便,因为它会返回下一个字符的单字符字符串。

但是,你会发现“向上/向下”键,如果用你的意思是箭头键,实际上是一系列字符。如今,在大多数类似ANSI的终端仿真器(例如xterm)上,向上箭头将是“\e[A”(例如\e是转义字符)。有termcap(终端能力)数据库来处理这类事情,你可以通过诅咒访问它们,但最初你可能会发现最容易尝试直接解释它们;如今,你不太可能使用ANSI代码之外的任何东西进入终端。

答案 1 :(得分:0)

你想要getch而不是getstr。另见curt sampson关于箭头键不是单个字符的评论。