diff --git a/reactos/lib/crt/conio/getch.c b/reactos/lib/crt/conio/getch.c index d51c4ac0290..0c3dccbc5fd 100644 --- a/reactos/lib/crt/conio/getch.c +++ b/reactos/lib/crt/conio/getch.c @@ -20,21 +20,41 @@ */ int _getch(void) { - DWORD NumberOfCharsRead = 0; + DWORD NumberOfCharsRead = 0; char c; + HANDLE ConsoleHandle; + BOOL RestoreMode; + DWORD ConsoleMode; + if (char_avail) { c = ungot_char; char_avail = 0; } else { + /* + * _getch() is documented to NOT echo characters. Testing shows it + * doesn't wait for a CR either. So we need to switch off + * ENABLE_ECHO_INPUT and ENABLE_LINE_INPUT if they're currently + * switched on. + */ + ConsoleHandle = (HANDLE) _get_osfhandle(stdin->_file); + RestoreMode = GetConsoleMode(ConsoleHandle, &ConsoleMode) && + (0 != (ConsoleMode & + (ENABLE_ECHO_INPUT | ENABLE_LINE_INPUT))); + if (RestoreMode) { + SetConsoleMode(ConsoleHandle, + ConsoleMode & (~ (ENABLE_ECHO_INPUT | ENABLE_LINE_INPUT))); + } ReadConsoleA((HANDLE)_get_osfhandle(stdin->_file), &c, 1, &NumberOfCharsRead, NULL); + if (RestoreMode) { + SetConsoleMode(ConsoleHandle, ConsoleMode); + } } if (c == 10) c = 13; - putchar(c); return c; }