#c #winapi #keyboard #keypress
#c #winapi #клавиатура #нажатие клавиши
Вопрос:
Почему после того, как я нажимаю стрелку направления, функция GetKeyState продолжает выдавать мне значение больше 0?
#include <iostream>
#include <windows.h>
using namespace std;
int main()
{
for(int i = 0; i < 1000; i)
{
if(GetKeyState(VK_UP))
{
cout << "UP pressed" << endl;
}
else
cout << "UP not pressed" << endl;
Sleep(150);
}
return 0;
}
Ответ №1:
Из документации:
Статус ключа, возвращаемый этой функцией, изменяется по мере того, как поток считывает ключевые сообщения из своей очереди сообщений. Состояние не отражает состояние уровня прерывания, связанное с оборудованием. Используйте функцию GetAsyncKeyState для извлечения этой информации.
Поскольку вы не обрабатываете сообщения, вместо этого вы захотите вызвать GetAsyncKeyState
.
Проверьте, нажата ли клавиша следующим образом:
if (GetAsyncKeyState(VK_UP) < 0)
// key is pressed
Ответ №2:
GetKeyState не возвращает «логическое значение». Взгляните на документацию :
http://msdn.microsoft.com/en-us/library/windows/desktop/ms646301 (v= против 85).aspx
Кажется, что вам нужно сделать :
if (GetKeyState(VK_UP) amp; 0x8000)
{
//Your code
}
else
{
// Not pressed
}
0x8000, если результатом является короткое или -127 /-128, если результатом является символ. Проверьте раздел «возвращаемое значение» документации, чтобы увидеть, что вы хотите
Ответ №3:
а также функция GetKeyState() может использоваться для обычных символьных клавиш, таких как ‘a’ ~ ‘Z’. (это не чувствительно к регистру)
if (GetKeyState('A' amp; 0x8000)
{
// code for Pressed
}
else
{
// code for Not Pressed
}
Комментарии:
1. Добро пожаловать в Stack Overflow! Пожалуйста, убедитесь, что ваш ответ отвечает непосредственно на вопрос, заданный OP.
2. Я думаю, что ваш двоичный оператор ‘amp;’ находится не в том месте. Не имеете ли вы в виду if ( GetKeyState(‘A’) amp; 0x8000) { } else { }