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

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

Например,

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

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


person Paz    schedule 30.04.2010    source источник
comment
Я думаю, что у вас есть опечатка в вашем примере кода - это должно быть GetKeyState('K') & 0x8000   -  person Stewart    schedule 30.04.2010
comment
кажется, он работает в моем приложении как есть?   -  person Paz    schedule 30.04.2010
comment
Что вы имеете в виду под работой? Если вы не знаете, что он должен делать, как вы узнаете, что он работает?   -  person Stewart    schedule 30.04.2010
comment
0x80 работает, хотя и странно   -  person Jacob    schedule 30.04.2010
comment
Ну, код перестал выполняться, когда ключ был поднят, что делает то же самое, когда он заменен на 0x8000. Однако ваш ответ имеет ПОЛНЫЙ смысл, почему он должен быть 0x8000, а не 0x80. Думаю, я запущу его в отладчике, как вы предложили. Спасибо, что пролили свет на этого Стюарта!   -  person Paz    schedule 30.04.2010
comment
@ Джейкоб, да, я так и думал, как ни странно, это сработало.   -  person Paz    schedule 30.04.2010
comment
Что ж, это не странно. Определение и реализация работают --- в конце концов, старший и младший биты установлены правильно! Это использование 0x80 странно, но оно также работает из-за возвращаемого значения GetKeyState   -  person Jacob    schedule 30.04.2010
comment
Это типично для Windows API. Многие программисты поняли это неправильно (это это убогий API), поэтому они исправили API, не документируя его, а также включили бит 7. Лучшей проверкой является GetKeyState('K') ‹ 0.   -  person Hans Passant    schedule 30.04.2010


Ответы (4)


Обновить

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

person Jacob    schedule 30.04.2010
comment
Однако старший бит SHORT будет 0x8000 - person James McNellis; 30.04.2010
comment
Это был бы старший бит BYTE, но функция возвращает SHORT, т. е. 16 бит. - person Stewart; 30.04.2010
comment
Обновил мой ответ с решением! - person Jacob; 30.04.2010

В документации MSDN по этой функции указано:

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

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

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

person shoosh    schedule 30.04.2010

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

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

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

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

person Stewart    schedule 30.04.2010
comment
Это будет работать, но вы зависите от недокументированного поведения. 0x8000 лучше. - person Stewart; 30.04.2010

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

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

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

person BlueRaja - Danny Pflughoeft    schedule 30.04.2010
comment
Документация MSDN не двусмысленна - старший бит SHORT равен 0x8000. Младший бит равен 0x0001. Я знаю, что это правда, потому что, когда я когда-либо использовал эту функцию, я обычно тестировал ее с ‹0, а не с &0x8000 - она ​​достигает того же результата. - person Stewart; 30.04.2010
comment
@Stewart: Я бы тоже так подумал, но тогда с чего бы это работать (если это действительно работает)? ... Кроме того, то, что вы сказали, не имеет ничего общего с тем, является ли младший бит 0x0080 или 0x0001. - person BlueRaja - Danny Pflughoeft; 30.04.2010
comment
Я не думаю, что когда-либо нуждался в низком бите. Я подозреваю, что код работает, потому что в документации ничего не говорится о значении битов с 1 по 14. Для нажатой непереключаемой клавиши 0xfffe будет идеальным возвращаемым значением в соответствии с документами. - person Stewart; 30.04.2010