что означает код 0x80 при обращении к элементам управления клавиатуры в среде C++ Windows?
Например,
if(GetKeyState('K') & 0x80) {
//do something
}
Спасибо всем!
что означает код 0x80 при обращении к элементам управления клавиатуры в среде C++ Windows?
Например,
if(GetKeyState('K') & 0x80) {
//do something
}
Спасибо всем!
Обновить
Шквал отрицательных голосов подтолкнул меня к дальнейшему изучению этого вопроса. Вот как работают возвращаемые значения (в шестнадцатеричном формате) 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
.
SHORT
будет 0x8000
- person James McNellis; 30.04.2010
В документации MSDN по этой функции указано:
Если старший бит равен 1, ключ нажат; в противном случае это вверх.
побитово и с 0x80 дает вам бит старшего разряда, if
проверяет, является ли результат нулевым или ненулевым, и, по сути, проверяет значение этого бита.
Эта проверка, однако, выглядит как ошибка, поскольку GetKeyState()
возвращает SHORT
, а для проверки старшего бита короткого замыкания вам нужно побитово и с 0x8000.
Поэтому я предлагаю вам проверить возвращаемое значение с помощью отладчика и проверить, как это работает в реальности.
Я думаю, вы имеете в виду 0x8000, а не 0x80. В этом случае вам следует обратиться к документации (http://msdn.microsoft.com/en-us/library/ms646301(VS.85).aspx), в котором говорится о возвращаемом значении GetKeyState:
Возвращаемое значение указывает состояние указанного виртуального ключа следующим образом:
• Если старший бит равен 1, ключ нажат; в противном случае это вверх. • Если младший бит равен 1, клавиша переключается. Клавиша, такая как клавиша CAPS LOCK, переключается, если она включена. Клавиша выключена и не переключается, если младший бит равен 0. Световой индикатор переключаемой клавиши (если есть) на клавиатуре будет гореть, когда клавиша переключается, и гаснет, когда клавиша не переключается.
Насколько я знаю, 0x80 ничего не значит
Согласно документации
Возвращаемое значение указывает состояние указанного виртуального ключа:
Если старший бит равен 1, ключ отключен; в противном случае — активен.
Если младший бит равен 1, клавиша переключается. Клавиша, например CAPS LOCK, переключается, если она включена. Клавиша выключена и не переключается, если младший бит равен 0. Световой индикатор переключаемой клавиши (если есть) на клавиатуре будет гореть, когда клавиша переключается, и гаснет, когда клавиша не переключается.
Возможно, с непереключаемой клавишей (такой как «K») младшие биты (неоднозначный термин — возможно, они означают 0x0080 ?) и старшие (0x8000) биты делают одно и то же?
0x80
работает, хотя и странно - person Jacob   schedule 30.04.20100x80
странно, но оно также работает из-за возвращаемого значенияGetKeyState
- person Jacob   schedule 30.04.2010