GetAsyncKeyState (VK_RETURN) неправильно оценивается как true - PullRequest
0 голосов
/ 17 июня 2019

Я пишу простую программу, которая записывает позиции и интервалы между щелчками.Во время настройки пользователь нажимает «ENTER», чтобы добавить новую позицию в список, и «ESC», как только они заканчивают ввод позиций.

Странное поведение, которое я получаю, заключается в том, что другие нажатия клавиш вызывают else if (GetAsyncKeyState(VK_RETURN)) неверно оценивать как истинное.Я предположил, что 'ENTER' для завершения std::cin задерживался в буфере и вызывал это значение true, однако я думал, что std::cin.get() и std::cin.ignore исправят это.

Почему именно эти ключикроме 'ENTER', значение (GetAsyncKeyState(VK_RETURN)) становится истинным?

void initialSetup() {

    int temp = 0;
    char input;

    std::cout << "Unique sleep times? (y/n):  ";
    std::cin >> input;
    std::cin.get();
    std::cin.ignore(100, '\n'); // discards the input buffer

    // Ask the user for a sleep each time, or use the same
    if (input == 'y') {
        uniqueSleepBetweenClicks = true;
    }
    else {
        // Sleep times are constant after each click
        std::cout << "Constant sleep time between clicks in ms:  ";
        std::cin >> constSleepBetweenClicks;
        std::cin.get();
        std::cin.ignore(100, '\n'); // discards the input buffer
    }

    std::cout << endl;
    std::cout << "***********************************" << endl;
    std::cout << "* 'ENTER' to set new position     *" << endl;
    std::cout << "* 'ESC' when done                 *" << endl;
    std::cout << "***********************************" << endl << endl;


    // Add new clicks to the sequence
    while (_getch()){

        Click click;

        if (GetAsyncKeyState(VK_ESCAPE)) {
            // Escape keypress ends adding new clicks
            break;
        }
        else if (GetAsyncKeyState(VK_RETURN)) {

            // Set the click position
            GetCursorPos(&click.point);
            std::cout << "Position set to (" << click.point.x << "," << click.point.y << ") " << endl;

            if (uniqueSleepBetweenClicks) {
                std::cout << "Sleep time in ms: ";
                std::cin >> click.sleep;
                std::cin.get();
                std::cin.ignore(100, '\n'); // discards the input buffer
            } 
            else { 
                click.sleep = constSleepBetweenClicks;
            }

            // Add to the list
            clickList.push_back(click);

        } 
    }
    return;
}

EDIT1: замена VK_RETURN на VK_SPACE делает программу отлично работающей.Кажется, проблема только в клавише ENTER.

1 Ответ

1 голос
/ 17 июня 2019

Вы не проверяете возвращаемое значение правильно, оно не возвращает BOOL!GetAsyncKeyState(VK_RETURN) < 0 или GetAsyncKeyState(VK_RETURN) > 0 в зависимости от того, что вы проверяете.В любом случае, GetAsyncKeyState не является правильным подходом для консольного приложения.

Используйте ReadConsoleInput - обрабатывать ввод в консоли .

Если вы хотите захватитьввод, даже когда пользователь работает в другом приложении, вы должны использовать hooks для захвата событий мыши и клавиатуры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...