Функция GetKeyState?

#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 { }