C ++ очищает буфер cin при использовании GetAsyncKeyState () - PullRequest
1 голос
/ 27 марта 2012

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

Итак, у меня есть функция, которая захватывает игроковимя, используя строку get, которая выглядит следующим образом.

std::cout << "Enter your name"<< std::endl;
std::string input;

std::getline(std::cin, input);

, и после этого у меня есть функция, которая имеет меню, которое сообщает пользователю, что он может нажать ряд клавиш, чтобы перейти к другим частям меню.

while(true)
{
        //menu one
        if(GetAsyncKeyState(VK_CONTROL))
        {
            Menu_3();
        }
        //here is the problem
        if(GetAsyncKeyState(VK_SHIFT) && GetAsyncKeyState(0x53)) //0X53 = S
        {
            Menu_4();
        }
}

Моя проблема в том, что если я использую имя с заглавной буквой (созданное с помощью SHIFT) и 's', то также автоматически вызывается Menu_4 () после ввода имени, например, имени «Shawn».если у меня есть только имя, подобное этому «shawn» (без использования shift), то эти «s», похоже, сохраняются в буфере cin, и все, что требуется для перехода, это нажать «shift», чтобы войти в Menu_4 ();

В основном ввод переносится из запроса имени getline, и он сбивает мои вызовы GetAsyncKeyState ().

Спасибо за вашу помощь.

Ответы [ 2 ]

2 голосов
/ 27 марта 2012

Я думаю, вы неправильно поняли поведение GetAsyncKeyState

см. GetAsyncKeyState

Если функция завершается успешно, возвращаемое значение указывает, является ли ключ был нажат с момента последнего вызова GetAsyncKeyState, и был ли ключ в настоящее время вверх или вниз. Если установлен самый старший бит, клавиша нажата, и если установлен младший значащий бит, ключ был нажата после предыдущего вызова GetAsyncKeyState

...

Хотя младший значащий бит возвращаемого значения указывает, является ли ключ был нажат с момента последнего запроса, из-за упреждающего многозадачность Windows, другое приложение может вызвать GetAsyncKeyState и получить «недавно нажатый» бит вместо ваше приложение. Поведение наименее значимого бита возвращаемое значение сохраняется строго для совместимости с 16-битным Windows-приложения (которые не являются приоритетными) и не должны полагался.

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

if(GetAsyncKeyState(VK_CONTROL) xor 0x1)
....
1 голос
/ 27 марта 2012

Вы просто принимаете возвращаемое значение GetAsyncKeyState (), поэтому эффективно делаете if(GetAsyncKeyState() != 0).В документах говорится:

Если функция завершается успешно, возвращаемое значение указывает, была ли клавиша нажата с момента последнего вызова GetAsyncKeyState, и была ли клавиша в данный момент вверх или вниз.Если установлен старший значащий бит, клавиша нажата, а если установлен младший значащий бит, клавиша была нажата после предыдущего вызова GetAsyncKeyState.

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

...