C ++ WINAPI: как использовать SendMessage / PostMessage WM_KEYDOWN lparam - PullRequest
1 голос
/ 23 октября 2010

Как любитель чего-то более низкого, чем VB / VBS (C ++ WINAPI - это кошмар для кого-то из моего опыта), я не представляю, как создать длинную lParam для простого сообщения KEYDOWN в C ++ и, вероятно, потратила больше времени Ищите достойное объяснение, чем оно того стоит, сможет ли кто-нибудь точно описать, как это сделать?

Кажется, что почти каждый ответ на этот вопрос на других форумах был «почему» или «вместо этого использовать SendInput», фактически не отвечая на вопрос; Я предполагаю, что это слишком элементарно для людей, чтобы объяснить. В любом случае, вот описание из msdn, очень хотелось бы получить достойное объяснение или ссылку на него, а также работающий пример, если это возможно:

Количество повторов, код сканирования, флаг расширенного ключа, код контекста, предыдущий флаг состояния ключа и флаг переходного состояния, как показано ...

0-15 Количество повторений для текущего сообщение. Значение является числом раз нажатие клавиши автоматически повторяется как результат пользователя, удерживающего ключ. Если нажатие клавиши удерживается долго достаточно, несколько сообщений отправляются. Тем не менее, количество повторений не накопительный. 16-23 Код сканирования. значение зависит от OEM.

24 Указывает, является ли ключ расширенный ключ, такой как правая рука Клавиши ALT и CTRL, которые появляются на улучшенная 101- или 102-клавишная клавиатура. значение равно 1, если это расширенный ключ; в противном случае оно равно 0. 25-28 Зарезервировано; делать не использовать

29 Код контекста. Значение равно 1, если клавиша ALT нажата, а клавиша нажимается; это 0, если WM_SYSKEYDOWN сообщение отправлено в активное окно потому что ни у какого окна нет клавиатуры фокус.

30 Предыдущее состояние ключа. Значение равен 1, если клавиша нажата до сообщение отправлено, или это 0, если ключ вверх.

31 Переходное состояние. Значение всегда 0 для сообщения WM_SYSKEYDOWN.

Ответы [ 2 ]

1 голос
/ 23 октября 2010

Из объяснения параметра lParam сообщения WM_KEYDOWN и Флаги сообщений нажатия клавиш , я напишу следующий код для работы со значением LPARAM

  iRepeatCount   := LOWORD(lParam);
  iScanCode      := HIWORD(lParam) and $FF;
  iExtendedKey   := (HIWORD(lParam) and KF_EXTENDED) shr 8;
  iContextCode   := (HIWORD(lParam) and KF_ALTDOWN) shr 13;
  iPreviousState := (HIWORD(lParam) and KF_REPEAT) shr 14;
  iKeyDown       := (HIWORD(lParam) and KF_UP) shr 15;

Хотя это реализация Delphi, я уверен, что вы можете понять такой простой код. : -)

ОК, для вашего удобства я гуглю для shr эквивалент инструкции в VB и получаю следующее:

  Private Function SHL(ByVal inVal As Long, ByVal inShift As Byte) As Long
     SHL = inVal * (2 ^ inShift) ' Bit shift left
  End Function

  Private Function SHR(ByVal inVal As Long, ByVal inShift As Byte) As Long
     SHR = inVal \ (2 ^ inShift) ' Bit shift right
  End Function

Чтобы имитировать LOWORD и HIWORD в VB, см. Как имитировать макросы HIWORD, LOWORD, HIBYTE, LOBYTE C в VB .

0 голосов
/ 23 октября 2010

http://msdn.microsoft.com/en-us/library/ms646280(VS.85).aspx

lparam является 32-битным значением; каждый бит управляет другим аспектом сообщения WM_KEYDOWN. Чтобы правильно заполнить lparam, вы можете попробовать использовать spy ++, чтобы посмотреть, как выглядят реальные сообщения WM_KEYDOWN.

...