Проблема с функцией GetAsyncKeyState()

136
07 мая 2019, 11:40

У меня есть меню, которое управляется стрелками и на нажатие Enter переходит по нужному пункту. Проблема в том, что все нажатия Enter сохраняются в буфера ввода. Допустим, после перехода по выбранному пункту пользователем нужно ввести какое либо значение, и из-за сохранения "прошлого" Enter'a у меня просто автоматически вводиться значение '\n'. Как это можно пофиксить?

Код:

    char check(void) { // Обработка нажатий клавиш
        while (true) {
            std::this_thread::sleep_for(std::chrono::milliseconds(80));
            if (GetAsyncKeyState(VK_UP) == -32767)
                return VK_UP;
            else if (GetAsyncKeyState(VK_DOWN) == -32767)
                return VK_DOWN;
            else if (GetAsyncKeyState(VK_RETURN) == -32767)
                return VK_RETURN;
        }
    };

    while (true) // Обработка клавиш
                switch (check()) {
                case VK_UP:
                    // Up
                    if (presentItem != 0) {
                        presentItem--;
                        system("cls");
                        show(entries, 2, presentItem);
                    }
                    break;
                case VK_DOWN:
                    // Down
                    if (presentItem != 1) {
                        presentItem++;
                        system("cls");
                        show(entries, 2, presentItem);
                    }
                    break;
                case VK_RETURN:
                    if (presentItem == 0) {
                        createList();
                        system("cls");
                        firstMenu();
                    }
                    else {
                        createList();
                        loadList();
                        system("cls");
                        firstMenu();
                    }
                    break;
                }
        }
    void loadList() {
        system("cls");
        std::string nameFile;
        std::cout << "File: "; // Error - Автоматический ввод '\n'
        std::cin >> nameFile;
  ...
  }
Answer 1

Попробуйте использовать

FlushConsoleInputBuffer( GetStdHandle( STD_INPUT_HANDLE ) );

Вызывать следует перед запросом входного буфера std::cin >> Например я проверял на функции:

void addEntry() {
    listStudents* newStudent = new listStudents;
    system("cls");
    FlushConsoleInputBuffer( GetStdHandle( STD_INPUT_HANDLE ) );
    std::cout << "ФИО: "; // Теперь y уже не появляется
    std::cin >> newStudent->student.name;
...

P.S. перед каждым std::cin >> вызывать нет нужды, достаточно вызывать перед началом блока ввода, ну т.е. 1 раз на функцию addEntry(). Вызовы std::cin.ignore(...) лучше удалить, т.к. это не совсем то, что надо и может давать не совсем те эффекты, которые нужны.

READ ALSO
Что представляет собой cout?

Что представляет собой cout?

cout не ключевое словоОн подключается через библиотеку iostream и сам редактор vs говорит что это функция

151
Странно работает цикл

Странно работает цикл

Есть код калькулятора ,вот он :

157
Структура данных для хранения callbackов

Структура данных для хранения callbackов

Мне нужна структура данных, которая каждой строке будет ставить в соответствие некоторую callback-функциюЭта структура будет инициализироваться...

139
Можно ли как-то ещё ускорить данный код?

Можно ли как-то ещё ускорить данный код?

Где subset1 и subset2 - это вектора подмножеств первой и второй половины множества соответственно

135