что 0x80 кодирует средний при обращении к средствам управления клавиатурой в среде Windows C++?
Например,
if(GetKeyState('K') & 0x80) {
//do something
}
Спасибо все!
В 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 ничего не значит, насколько я знаю
.Обновление
Шквал голосов против побудил меня продолжить расследование этого вопроса. Вот как работают возвращаемые значения (в шестнадцатеричном формате) GetKeyState
. Я не совсем понимаю свойство toggle ключа вроде 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
.
Согласно документации
Возвращаемое значение определяет статус указанного виртуального ключа:
Если старший бит равен 1, клавиша находится в нижнем положении, в противном случае - в верхнем.
Если младший бит равен 1, клавиша переключена. Клавиша, например клавиша CAPS LOCK, переключается, если она включена. Если младший бит равен 0, клавиша выключена и не переключена. Индикатор переключения клавиши (если таковой имеется) на клавиатуре будет гореть, когда клавиша переключена, и гаснуть, когда клавиша не переключена.
Возможно, при непереключаемой клавише (например, 'K') младший (неоднозначный термин - возможно, они имеют в виду 0x0080 ?) и старший (0x8000) биты делают то же самое?