Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: 6308
Последний выпуск: 19.06.2015

VK_TAB: приходит лишь сообщение об отпускании клавиши ( Message.lParam < 0)

7.4K
12 августа 2011 года
malor
69 / / 20.01.2007

Почему про нажатие клавиши не приходит сообщения? Т.е. с Message.lParam большим нуля.
Код:
procedure TForm1.Wndproc(var Message: TMessage);
var
    strLog: AnsiString;
begin
  case Message.Msg of
    WM_KEYDOWN, WM_SYSKEYDOWN, WM_SYSKEYUP, WM_KEYUP:
    begin
      strLog := 'wParam: ' + IntToStr(Message.wParam) +
                ' lParam: ' + IntToStr(Message.lParam);
    end;
  else
    inherited;
  end;
end;


Delphi XE
[ATTACH]5275[/ATTACH]
278
12 августа 2011 года
Alexander92
1.1K / / 04.08.2008
Что-то я не понял в этой жизни, а с каких пор Message.lParam отвечает за то, нажали клавишу или отпустили?
7.4K
12 августа 2011 года
malor
69 / / 20.01.2007
Он каким-то битом отвечает за это!
278
12 августа 2011 года
Alexander92
1.1K / / 04.08.2008
Как он может за это отвечать, если сообщения разные? Как может сообщение WM_KEYDOWN содержать бит о том, что клавиша отпущена, и наоборот? "Какой-то бит" - это только предыдущее состояние клавиши. Перечитайте MSDN.

[QUOTE=MSDN]
The previous key state. The value is 1 if the key is down before the message is sent, or it is zero if the key is up.
[/QUOTE]
7.4K
12 августа 2011 года
malor
69 / / 20.01.2007
Юрий Щупак в книге "Win32 API. Эффективная разработка приложений", , 2007 г., на стр.218 пишет:



31 бит - новое состояние клавиши.
278
12 августа 2011 года
Alexander92
1.1K / / 04.08.2008
Это из описания какого сообщения? Если для WM_CHAR - тогда да. Но WM_CHAR, как правило, в главном цикле транслируется в WM_KEYDOWN, для которого этот флаг уже бессмысленен и для которого его уже нет. Читаем:

[QUOTE=MSDN]
WM_CHAR
31 The transition state. The value is 1 if the key is being released, or it is 0 if the key is being pressed.

WM_KEYDOWN
31 The transition state. The value is always 0 for a WM_KEYDOWN message.

WM_KEYUP
31 The transition state. The value is always 1 for a WM_KEYUP message.
[/QUOTE]

Аналогично для WM_SYSKEYDOWN / WM_SYSKEYUP.

Upd: а какое отношение 31-й бит имеет к знаку Message.lParam?
14
13 августа 2011 года
Phodopus
3.3K / / 19.06.2008
Тоесть Щупак нигде не облажался. Полей и правда 6. Но 6-е поле не имеет смысла для, положим, WM_KEY{UP,DOWN}
7.4K
13 августа 2011 года
malor
69 / / 20.01.2007
Добавил такой код:
Код:
procedure TForm1.CMDialogKey(var AMessage: TCMDialogKey);
var   strLog: AnsiString;
begin
  if AMessage.CharCode = VK_TAB then begin
      strLog := 'wParam: ' + IntToStr(AMessage.CharCode) + ' lParam: '
                   + IntToStr(AMessage.KeyData);
     AMessage.result := 1;
     Exit;
  end;
  inherited;
end;


>>а какое отношение 31-й бит имеет к знаку Message.lParam?

Никакого) Это IntToStr() дарит ему знак.
14
13 августа 2011 года
Phodopus
3.3K / / 19.06.2008
31й бит это знак Message.lParam
7.4K
13 августа 2011 года
malor
69 / / 20.01.2007
Прям как в учебниках )
278
13 августа 2011 года
Alexander92
1.1K / / 04.08.2008
Цитата: Phodopus
31й бит это знак Message.lParam


Все, вопрос снят. Это я не включился, что это старший бит.

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог