Нет соответствующих ответов о фактическом поведении kbhit() для таких символов, как «,%, ~ в Windows 10, когда клавиатура и языковой стандарт являются американскими (не международными)

Windows 10 с последними обновлениями, установленными на Dell XPS13. Выбрана раскладка клавиатуры США и язык США (не международный). Тем не менее вызов kbhit() или _kbhit() с определенными символами, такими как ", ~, %, не возвращает нажатие клавиши, по крайней мере, до тех пор, пока не пройдет определенное время (~ 1 секунда) и не будет нажат второй символ. I попробуйте использовать kbhit(), потому что мне нужна функция без ожидания Как я могу правильно определить нажатие клавиатуры на " или % одним нажатием клавиши? В Linux использование тайм-аута select() на стандартном вводе отлично работает, но не похоже на Windows.

Спасибо, - Патрик


person Patrick    schedule 28.10.2018    source источник
comment
Наконец-то я нашел решение, которое соответствует моим потребностям и устраняет проблемы с kbhit(); код ниже; Я надеюсь, что это поможет и другим.   -  person Patrick    schedule 01.11.2018


Ответы (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)); в приведенном выше коде, но по какой-то неизвестной причине он не отвечает/реагирует так быстро, и некоторые символы пропускаются при наборе на клавиатуре.

person Patrick    schedule 01.11.2018