Значение LPARAM
и WPARAM
варьируется для конкретного обрабатываемого сообщения.Вот почему документация для PostMessage
не может быть слишком специфичной для этих параметров, а только:
Дополнительная информация, специфичная для сообщения.
На обоих.Чтобы точно знать, что они означают для каждого сообщения, вам нужно посмотреть документацию к этому сообщению.
В случае сообщений, о которых вы спрашиваете, WM_KEYUP
и WM_KEYDOWN
, значение LPARAM
указывает:
Счетчик повторений, код сканирования, расширенный ключфлаг, код контекста, предыдущий флаг состояния ключа и флаг переходного состояния, как показано в следующей таблице.(Источник # 1 , # 2 )
Bits Meaning
0-15 The repeat count for the current message. The value is the number of times the keystroke is autorepeated as a result of the user holding down the key.
16-23 The scan code. The value depends on the OEM.
24 Indicates whether the key is an extended key, such as the right-hand ALT and CTRL keys that appear on an enhanced 101- or 102-key keyboard. The value is 1 if it is an extended key; otherwise, it is 0.
25-28 Reserved; do not use.
29 The context code.
30 The previous key state.
31 The transition state.
Давайте рассмотрим биты для вашего WM_KEYDOWN
LPARAM
там:
0x002C0001
0b0000000000101100000000000001
Устанавливаются биты 21, 19, 18 и 0. Это говорит нам о том, что:
Количество повторений равно 1
Остальные биты являются кодом сканирования для z
, который явно равен 0b00101100 или 0x2C.
Сообщение WM_KEYUP
имеет значение LPARAM
0xC02C0001, которое отличается только при самом значительном nybble, давая нам:
0b1100000000101100000000000001
Итак,единственное отличие здесь состоит в том, что биты предыдущего состояния и состояния перехода равны 1, что в любом случае гарантировано для сообщения WM_KEYUP
.
Что касается другого вашего вопроса:
Можно ли создать две функции, скажем, CreateLPARAM_KeyDown () и CreateLPARAM_KeyUp (), где вы просто передаете код сканирования?
Конечно.Посмотрите на MapVirtualKey
, чтобы определить, как получить код сканирования из кода ключа, и использовать битовые операции для создания 32-битного LPARAM
из этого и всего остального, что вы знаете из таблицы выше обиты, которые должны быть установлены для этих сообщений.Для этого вам потребуется использовать битовое смещение и другие битовые операции, поскольку код сканирования представляет собой один 8-битный байт, который хранится как часть 32-битного LPARAM
.