Получить 30-й бит параметра lParam в сообщении WM_KEYDOWN

#c #winapi #windows-messages #bit-shift

#c #winapi #windows-сообщения #сдвиг в битах

Вопрос:

Мне нужно получить 30-й бит параметра lParam, переданный с сообщением WM_KEYDOWN. Этот бит, как написано здесь, позволяет мне узнать, была ли клавиша нажата ранее. Подходит ли этот код для его получения?

 (lParam >> 30) amp; 1
  

Комментарии:

1. Просто придираюсь, но (lParam >> 30) amp; 1 проверяет, установлен ли 31-й бит.

Ответ №1:

Я бы просто использовал lParam amp; 0x40000000 . Если это значение не равно нулю, значит, b30 было установлено (кстати, я считаю, что это тридцать первый бит из тридцати двух). И больше вероятности, что это будет {logical-and, compare} операция, а не {shift, logical-and, compare} .

Имейте в виду, есть хороший шанс, что приличный компилятор в любом случае сгенерирует более эффективный код, даже если вы использовали (lParam >> 30) amp; 1 но зачем рисковать?

Комментарии:

1. @paxdiablo ты уверен насчет этого? Я получаю странное поведение с вашим кодом. Я должен проверить и присвоить логической переменной значение true, только если ключ был выпущен до отправки сообщения. Для этого я должен проверить, равен ли 30-й бит 1 (клавиша нажата до отправки сообщения)

2. @Frerich, на самом деле это 15-й бит, но я понимаю, к чему ты клонишь — глупая ошибка с моей стороны, которую я сейчас исправил.

3. @Stefano, b30 это 31-й бит, потому что биты варьируются от b0 (первого) до b31 (тридцать второго). Это всего лишь небольшая разница в именовании, потому что, несмотря на то, в чем вас будут пытаться убедить технические специалисты, first по-прежнему означает first 🙂 0x400000000 является двоичным 0100 0000 0000 0000 0000 0000 0000 0000 , что и является маской, которую вы ищете. Размещенная вами ссылка использует позиции битов (0-31), а не first через thirty-second .

4. @paxdiablo: Я бы хотел отозвать свой голос понижения теперь, когда вы исправили ответ, но, похоже, мой голос «заблокирован» до тех пор, пока ответ не будет отредактирован. :-/

5. @Frerich, я обычно делаю «фантомную» правку, когда хочу это сделать (что-то, что не меняет сути ответа, но все же обходит «рекомендации» SO). Вы должны быть в состоянии сделать это сейчас, если хотите. Или, серьезно, вы можете просто не беспокоиться об этом. 2 повторных пункта не изменят мою жизнь 🙂 и я позже голосую за мой улучшенный ответ, обычно эффект в любом случае обратный. Так что никаких обид, если у вас не найдется на это времени.