2014-02-10 4 views
0

У меня есть программа, затем она запускается, она запрашивает информацию, а затем пользователю нужно нажать 1, чтобы продолжить. Я использую функцию GetKeyState(), чтобы решить, был ли номер нажат, и SetKeyboardState(), чтобы установить ключи, но после второй попытки он не работает. Что не так?SetKeyboardState не работает должным образом

Код:

BYTE States[256]; 
GetKeyboardState(States); 

cout << press 1 << endl; 

while(!Started) 
{ 
    if(GetKeyState(VK_NUMPAD1)) 
    { 
     Started = true; 
    } 
} 

SetKeyboardState(States); 

cout << "press 1" << endl; 

while(!Name) 
{ 
    if(GetKeyState(VK_NUMPAD1)) 
    { 
     Name = true; 
    } 
} 

SetKeyboardState(States); 

cout << "press 1" << endl; 

while(!Located) 
{ 
    if(GetKeyState(VK_NUMPAD1)) 
    { 
     Located = true; 
    } 
} 
+0

'if (GetKeyState (VK_NUMPAD1) <0)' правильный тест, но я не знаю, чего вы на самом деле надеетесь достичь. Почему бы вам просто не назвать «GetAsyncKeyState»? –

+0

Я попытался с GetAsyncKeyState, но после первого нажатия он остается верным, и я не знаю, как установить ключ в не нажатый – Magician

+0

Вы понимаете разницу между 'GetKeyState' и' GetAsyncKeyState'? Вы должны сделать следующее: Используйте 'GetAsyncKeyState', чтобы обнаружить, что ключ не работает, и принять меры. Затем дождитесь, пока 'GetAsyncKeyState' говорит, что ключ снова встает, прежде чем переходить к циклу для следующего ключа. Попытка справиться с нажатиями клавиш, подобными этому, в консольном приложении довольно беспорядочно. Почему вы выбрали консольное приложение, а не графическое приложение? –

ответ

1

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

Одна вещь выставляется, хотя. Ваш тест возвращаемого значения GetKeyState() неправильно, вы должны проверить это следующим образом:

if(GetKeyState(VK_NUMPAD1)<0) 

Из документации:

Если старший бит равен 1, то клавиша нажата; в противном случае, это вверх.

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

1

Я не эксперт, но, насколько я могу видеть, ваше время проверяет переменные являются ложными (Имя!). Внутри цикла вы устанавливаете их в true и концы цикла, которые не позволяют вам проверять ключ больше, чем один раз.

+0

Почему? Я перезаписываю состояния с помощью функции SetKeyboardState. По крайней мере, я так думаю. – Magician

+0

Переменные внутри цикла являются проблемой. Попробуйте установить значение false. –

+0

@TheShy Он тестирует разные bools в каждом отдельном блоке –

Смежные вопросы