Forum: Ruby How to capture a pressed key?

Announcement (2017-05-07): is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see and for other Rails- und Ruby-related community platforms.
Rubyist (Guest)
on 2006-01-24 18:58
(Received via mailing list)

How can I capture a key from keyboard in a console program? I mean, I
want to get an answer consisted of only one letter and the user will
not press "enter". Just a key, that's all.

Thank you.
unknown (Guest)
on 2006-01-24 19:05
(Received via mailing list)
print "Enter your name: "
name = gets

to get the first letter of 'name' you would access it by name[0,1]
Rubyist (Guest)
on 2006-01-24 19:14
(Received via mailing list)
Oh, I know the "gets". But user will need to press "enter" in order to
"gets" to get something. I want to let the interpreter get a letter
WITHOUT pressing the enter key.
Dale M. (Guest)
on 2006-01-24 19:29
(Received via mailing list)
Are you running on Windows or Linux?

In Windows, you can do something like this:

  require 'Win32API'

  $win32_console_kbhit ="msvcrt", "_kbhit", [], 'I')
  $win32_console_cputs ="msvcrt", "_cputs", ['P'], 'I')
  $win32_console_getch ="msvcrt", "_getch", [], 'I')

  def console_input_ready?
    $ != 0

  def console_input

  def console_output( str )
    $ str )

  while true
    if console_input_ready? then
        ch = console_input
        print "ch: <#{ch.chr}>\n"
        console_output( "." )
        sleep 0.5
Rubyist (Guest)
on 2006-01-24 19:29
(Received via mailing list)
Gulp! I thought that could be done in two or three lines... :-(
Marius Friis (Guest)
on 2006-01-24 22:13
(Received via mailing list)
You might want to look into the curses/ncurses library for Ruby. This
does what
you want, but there might be a bit too much overhead for what your
planning to do.

Another thing that comes to mind is using non-blocking IO on stdin.
not even sure if this is possible tho.
Payton S. (Guest)
on 2006-01-25 04:58
(Received via mailing list)
It's just not as easy as it may seem.  This is true of any language.
Basically it depends on the environment (UI) that you're using to
interface with the user.  I would suggest (perhaps) Ncurses, since it's
designed to handle that sort of thing (the shell isn't).  Perhaps I'll
write a simple Ncurses gem to do this for you sometime...

Good luck.

Konstantin Levinski (Guest)
on 2006-01-25 05:55
(Received via mailing list)
require 'curses'
def get_char_now();
   char = Curses.getch
   return char

warning - code is approximate, you have to lookup Curses docs.
Depending on your application, it might make sense just to use curses
for everything, then there is no need to start/stop it every time.

Curses work on windows in cygwin, I haven't tried the native installer.
This topic is locked and can not be replied to.