How to capture a pressed key?

R

Rubyist

Hi,

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.
 
R

Rubyist

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.
 
D

Dale Martenson

Are you running on Windows or Linux?

In Windows, you can do something like this:

require 'Win32API'

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

def console_input_ready?
$win32_console_kbhit.call != 0
end

def console_input
$win32_console_getch.call
end

def console_output( str )
$win32_console_cputs.call( str )
end

while true
if console_input_ready? then
ch = console_input
print "ch: <#{ch.chr}>\n"
break
else
console_output( "." )
sleep 0.5
end
end
 
M

Marius Friis

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.
 
K

Konstantin Levinski

require 'curses'
def get_char_now();
Curses.init_screen
char = Curses.getch
Curses.close_screen
return char
end

---
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.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,769
Messages
2,569,580
Members
45,054
Latest member
TrimKetoBoost

Latest Threads

Top