2012-03-27 3 views
1

Привет, ребята, у меня есть вопрос, на который я давно искал ответ, я видел много вопросов, но никто не решил мою проблему.C++ clearing cin buffer при использовании GetAsyncKeyState()

Итак, у меня есть функция, которая захватывает имя игрока, используя строку 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» (без использования сдвига), то это «s», похоже, сохраняется в буфере cin, и все, что требуется для перемещения, это нажать «shift», чтобы войти в Menu_4();

Как правило, входные данные передаются с запросом имени getline и закручивают мои вызовы GetAsyncKeyState().

Благодарим за помощь.

ответ

2

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

см GetAsyncKeyState

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

...

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

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

if(GetAsyncKeyState(VK_CONTROL) xor 0x1) 
.... 
+0

О, я вижу, но почему у вас есть xor там, что это должно быть определено как? Спасибо – user1143896

+0

Я понял, мне нужно было получить GetAsyncKeyState (VK_SHIFT) & 0x8000, спасибо за вашу помощь. – user1143896

+2

'xor 0x1' просто переключает LSB, это неверно. А также: MS-документы MSB и LSB, MS ничего не говорит о битах между ними. Поэтому даже проверка 'if (GetAsyncKeyState (...) & ~ 0x1)' подвержена ошибкам в случае будущих изменений API. Проверка 'GetAsyncKeyState (...) & 0x8000' - это путь. –

1

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

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

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