Как я могу получить старшие и младшие биты SHORT? - PullRequest
6 голосов
/ 14 марта 2011

Функция GetKeyState () возвращает SHORT, который содержит состояние ключа (вверх / вниз в старшем бите и переключается в младшем порядке).Как я могу получить эти значения?

Ответы [ 7 ]

10 голосов
/ 14 марта 2011

Будет работать простая битовая манипуляция.SHORT - это 16-битные целые числа, поэтому для получения младших и старших битов вы можете сделать следующее:

lowBit = value & 1;
highBit = ((unsigned short) value) >> 15;

Также обратите внимание, что макросы LOBYTE и HIBYTE используются для разбиения SHORT на младшиеи старшие байты , чтобы не проверять отдельные биты в байте.

6 голосов
/ 14 марта 2011

Это не то, как вы используете возвращаемое значение GetKeyState (). Сделайте это следующим образом:

SHORT state = GetKeyState(VK_INSERT);
bool down = state < 0;
bool toggle = (state & 1) != 0;
3 голосов
/ 26 декабря 2012

Обычный способ проверки результата GetKeyState или GetAsyncKeyState - побитовый, а с 0x8000 (двоичный 1000 0000 0000 0000).

#define IS_DOWN( GetKeyState(x) & 0x8000 )
if( IS_DOWN( VK_ESCAPE ) ) // escape is down.
2 голосов
/ 14 марта 2011
#define LOBYTE(a) ((CHAR)(a))
#define HIBYTE(a) ((CHAR)(((WORD)(a) >> 8) & 0xFF))
1 голос
/ 14 марта 2011

WORD == SHORT, HIWORD работает с DWORD, HIBYTE работает с SHORT / WORD.

0 голосов
/ 08 февраля 2018

Если Google привел вас сюда так же, как я, пытаясь найти информацию по GetKeyboardState() вместо GetKeyState(), обратите внимание, что он действует на массив BYTE , а не SHORT .

  • Если вы выбираете побитовый AND, вам следует использовать 0x80, а не 0x8000.
  • Если вы переключаетесь, используйте >> 7, а не >> 15.

Например, чтобы определить, не нажаты ли клавиши CTRL:

BYTE keyboardState[256];
GetKeyboardState(keyboardState);
if (keyboardState[VK_CONTROL] & 0x80)
{
    std::cout << "control key!" << std::endl;
}
0 голосов
/ 22 января 2018

GetKeyState в настоящее время возвращает SHORT тип данных, который typedef из short.short находится в пределах диапазона –32,768 to 32,767.Один из подходов для определения максимального разрешенного бита (ключ не работает) - сделать его без знака и затем выполнить запрос к 0x8000 константному значению.

Другой подход - сохранить значение как подписанное и просто сравнить его с 0.

bool bIsKeyDown = GetKeyState(VK_SHIFT) < 0;

Как упоминалось здесь: https://stackoverflow.com/a/5789914/2338477

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

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

bits  value
0000    0
0001    1
0010    2
0011    3
0100    4
0101    5
0110    6
0111    7
1000   -8
1001   -7
1010   -6
1011   -5
1100   -4
1101   -3
1110   -2
1111   -1

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

bool bIsKeyToggled = GetKeyState(VK_SHIFT) & 1;
...