В Windows можно сделать так:
WCHAR ReadChar(HANDLE hInput) {
INPUT_RECORD rec; DWORD t;
while (
ReadConsoleInput(hInput, &rec, 1, &t)) {
if (rec.EventType != KEY_EVENT) continue;
if (rec.Event.KeyEvent.bKeyDown) return rec.Event.KeyEvent.uChar.UnicodeChar;
}
return 0;
}
Функция ожидает нажатия клавиши и возвращает введённый символ (без его отображения в консоли) или 0 в случае ошибки. Можно также возвращать простой однобайтовый char используя rec.Event.KeyEvent.uChar.AsciiChar или
виртуальный код клавиши используя rec.Event.KeyEvent.wVirtualKeyCode.
Если же нужно просто проверить состояние конкретной клавиши (т. е. без ожидания её нажатия), то используй функцию
GetAsyncKeyState.