Что делает код 0x80, средний при обращении к средствам управления клавиатурой

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

Например,

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

Спасибо все!

5
задан Paz 30 April 2010 в 18:36
поделиться

4 ответа

В MSDN-документации функции говорится:

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

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

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

3
ответ дан 18 December 2019 в 13:12
поделиться

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

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

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

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

.
2
ответ дан 18 December 2019 в 13:12
поделиться

Обновление

Шквал голосов против побудил меня продолжить расследование этого вопроса. Вот как работают возвращаемые значения (в шестнадцатеричном формате) 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 .

8
ответ дан 18 December 2019 в 13:12
поделиться

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

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

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

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

1
ответ дан 18 December 2019 в 13:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: