Что означает код 0x80 при обращении к элементам управления клавиатуры - PullRequest
5 голосов
/ 30 апреля 2010

что означает код 0x80 при обращении к элементам управления клавиатуры в среде C ++ Windows?

Например,

if(GetKeyState('K') & 0x80) { 
    //do something 
}

Спасибо всем!

Ответы [ 4 ]

8 голосов
/ 30 апреля 2010

Обновление

Шквал голосов подтолкнул меня к дальнейшему расследованию. Вот как работают возвращаемые значения (в шестнадцатеричном формате) GetKeyState. Я не совсем понимаю свойство переключения ключа, например k, но я предполагаю, что есть какое-то состояние по умолчанию, из которого оно переключается.

0      Default State, key up
ff80    Default state, key down
1       Toggled, key up
ff81    Toggled, key down

Таким образом, 0xff80 добавляется всякий раз, когда необходимо установить бит старшего разряда, и бит младшего разряда имеет смысл. Итак, теперь мы знаем, почему работает подход 0x80 - поскольку бит старшего разряда младшего байта также установлен!

Старый ответ

GetKeyState возвращает SHORT, где, если старший бит равен 1, это означает, что ключ активен. Операция побитового И с 0x80 просто проверяет, равен ли этот бит 1, поскольку в двоичном формате 0x80 равен 10000000.

Следовательно, оператор GetKeyState('K') & 0x80 вернет 0x80, если старший бит значения, возвращаемого GetKeyState('K'), равен 1 и 0, если старший бит 0.

3 голосов
/ 30 апреля 2010

Документация для MSDN функции гласит:

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

побитово и с 0x80 дает вам бит старшего разряда, if проверяет, является ли результат нулевым или ненулевым, и по существу проверяет значение этого бита.

Эта проверка, однако, выглядит как ошибка, поскольку GetKeyState() возвращает SHORT, и для проверки старшего бита короткого замыкания вам нужно поразрядно с 0x8000. Поэтому я предлагаю вам проверить возвращаемое значение с помощью отладчика и проверить, как это работает на самом деле.

2 голосов
/ 30 апреля 2010

Я думаю, что вы имеете в виду 0x8000, а не 0x80. В этом случае вам следует обратиться к документации (http://msdn.microsoft.com/en-us/library/ms646301(VS.85).aspx), в которой говорится следующее о возвращаемом значении GetKeyState: -

Возвращаемое значение указывает состояние указанного виртуального ключа следующим образом:

• Если старший бит равен 1, клавиша не нажата; в противном случае это вверх. • Если младший бит равен 1, ключ переключается. Клавиша, такая как клавиша CAPS LOCK, переключается, если она включена. Клавиша выключается и не переключается, если младший бит равен 0. Индикатор клавиши переключения (если есть) на клавиатуре будет гореть при переключении клавиши и выключаться, когда клавиша не переключается.

0x80 ничего не значит, насколько я знаю

1 голос
/ 30 апреля 2010

Согласно документации

Возвращаемое значение указывает состояние указанного виртуального ключа:
Если старший бит равен 1, ключ не работает; в противном случае это происходит.
Если младший бит равен 1, клавиша переключается. Клавиша, такая как клавиша CAPS LOCK, переключается, если она включена. Клавиша выключается и не переключается, если бит младшего разряда равен 0. Индикаторная клавиша переключателя (если есть) на клавиатуре будет гореть при переключении клавиши и выключаться, когда клавиша не переключается.

Возможно, с неотключаемым ключом (таким как 'K') младшие (неоднозначный термин - возможно, они означают 0x0080?) и старшие (0x8000) биты делают то же самое

...