Объединив различные решения, которые я только что прочитал, я нашел кросс-платформенный способ решения этой проблемы.
Подробности здесь , но вот соответствующий фрагмент кода: метод GetKey.getkey
, возвращающий код ASCII, или nil
, если ни одна из них не была нажата.
Должно работать как в Windows, так и в Unix.
module GetKey
# Check if Win32API is accessible or not
@use_stty = begin
require 'Win32API'
false
rescue LoadError
# Use Unix way
true
end
# Return the ASCII code last key pressed, or nil if none
#
# Return::
# * _Integer_: ASCII code of the last key pressed, or nil if none
def self.getkey
if @use_stty
system('stty raw -echo') # => Raw mode, no echo
char = (STDIN.read_nonblock(1).ord rescue nil)
system('stty -raw echo') # => Reset terminal mode
return char
else
return Win32API.new('crtdll', '_kbhit', [ ], 'I').Call.zero? ? nil : Win32API.new('crtdll', '_getch', [ ], 'L').Call
end
end
end
А вот простая программа для проверки:
loop do
k = GetKey.getkey
puts "Key pressed: #{k.inspect}"
sleep 1
end
В приведенной выше ссылке я также показываю, как использовать библиотеку curses
, но в Windows результат становится немного странным.