1

Is there anything like Console.ReadKey from .NET in Eiffel on Windows?

I need a way to read input from the console without waiting for the user to press Enter.

The function io.read_character cannot be used because it blocks until the user presses Enter.

Cepheus
  • 579
  • 4
  • 14

1 Answers1

1

As explained in answers on SO (here or here) as well as elsewhere, there is no portable way to read a character from a console without waiting. However you can easily use any of the approaches listed in the links by interfacing to external code from Eiffel. The following example demonstrates how to do it on Windows:

read_char: CHARACTER
        -- Read a character from a console without waiting for Enter.
    external "C inline use <conio.h>"
        alias "return getch ();"
    end

Then the feature read_char can be called from your code as a regular one:

        from
            io.put_string ("Press q or Esc to exit.")
            io.put_new_line
        until
            c = 'q' or c = '%/27/'
        loop
            c := read_char
            io.put_string ("You pressed: ")
            if c = '%U' or c = '%/224/' then
                    -- Extended key is pressed, read next character.
                c := read_char
                io.put_string ("extended key ")
                io.put_natural_32 (c.natural_32_code)
            else
                io.put_character (c)
            end
            io.put_new_line
        end
Community
  • 1
  • 1
Alexander Kogtenkov
  • 5,770
  • 1
  • 27
  • 35