GetAsyncKeyState(VK_RETURN)错误地评估为true

时间:2019-06-17 03:02:28

标签: c++ .net windows keypress

我正在编写一个简单的程序,该程序记录单击位置和单击之间的间隔。在设置过程中,用户按“ ENTER”将新位置添加到列表中,然后按“ ESC”完成输入位置。

我得到的一些怪异行为是其他按键导致else if (GetAsyncKeyState(VK_RETURN))被错误地评估为true。我的猜测是,结束std::cin的'ENTER'在缓冲区中徘徊,并导致该错误,但是我认为std::cin.get()std::cin.ignore可以解决这个问题。

为什么除“ ENTER”键以外的其他键导致(GetAsyncKeyState(VK_RETURN))的计算结果为true?

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 个答案:

答案 0 :(得分:1)

您没有正确检查返回值,它不会返回BOOL! GetAsyncKeyState(VK_RETURN) < 0GetAsyncKeyState(VK_RETURN) > 0取决于您要检查的内容。无论哪种方式,GetAsyncKeyState都不是控制台应用程序的正确方法。

使用ReadConsoleInputhandle input in a console

如果即使用户正在使用其他应用程序也要捕获输入,则应使用hooks捕获鼠标和键盘事件。