Нет соответствующих ответов о реальном поведении kbhit() для таких символов, как ", %, ~ в Windows 10, когда клавиатура и локаль - США (не международные)
Windows 10 с последними обновлениями, установленными на Dell XPS13. Американская раскладка клавиатуры и выбранный язык США (не международный). Тем не менее, вызов kbhit () или _kbhit() с определенными символами, такими как ", ~, %, не возвращает нажатие клавиши, по крайней мере, до определенного времени (~1 секунда) и второй символ был достигнут. I попробуйте использовать kbhit (), потому что мне нужна функция без ожидания. Как я могу правильно определить нажатие клавиатуры "или% одним нажатием клавиши? В Linux использование тайм-аута select () в stdin прекрасно работает, но, похоже, не подходит для Windows.
Спасибо, Патрик
1 ответ
Наконец-то я нашел решение, которое соответствует моим потребностям и устраняет проблемы с kbhit()
; код ниже; Я надеюсь, что это помогает другим.
- Патрик
int getkey();
//
// int getkey(): returns the typed character at keyboard or NO_CHAR if no keyboard key was pressed.
// This is done in non-blocking mode; i.e. NO_CHAR is returned if no keyboard event is read from the
// console event queue.
// This works a lot better for me than the standard call to kbhit() which is generally used as kbhit()
// keeps some characters such as ", `, %, and tries to deal with them before returning them. Not easy
// the to follow-up what's really been typed in.
//
int getkey() {
INPUT_RECORD buf; // interested in bKeyDown event
DWORD len; // seem necessary
int ch;
ch = NO_CHAR; // default return value;
PeekConsoleInput(GetStdHandle(STD_INPUT_HANDLE), &buf, 1, &len);
if (len > 0) {
if (buf.EventType == KEY_EVENT && buf.Event.KeyEvent.bKeyDown) {
ch = _getche(); // set ch to input char only under right conditions
} // _getche() returns char and echoes it to console out
FlushConsoleInputBuffer(GetStdHandle(STD_INPUT_HANDLE)); // remove consumed events
} else {
Sleep(5); // avoids too High a CPU usage when no input
}
return ch;
}
Также можно позвонить ReadConsoleInput(GetStdHandle(STD_INPUT_HANDLE), &buf, 1, &len);
скорее, чем FlushConsoleInputBuffer(GetStdHandle(STD_INPUT_HANDLE));
в приведенном выше коде, но по неизвестной причине, он, кажется, не отвечает и не реагирует так быстро, и некоторые символы пропускаются при вводе с клавиатуры.