Delphi: Могу ли я различить клавишу ввода numpad и возврат каретки? - PullRequest
10 голосов
/ 23 декабря 2009

У меня есть странное маленькое приложение, которое выскакивает на экран цифровую панель / калькулятор, написанный на Delphi. Я хотел бы сделать так, чтобы, если бы вы нажали «ввод» (на цифровой клавиатуре), вы бы нажали «=», а если бы вы нажали «возврат» (на основной клавиатуре), вы бы нажали «ОК».

Есть кнопка OK, которая является парнем по умолчанию в форме, который отвечает на нажатие ввода или возврата. Существует также обработчик события onkeydown, который потенциально может захватывать как Enter, так и возвращаться как vk_return. Но его обязанности узурпированы кнопкой «ОК» по умолчанию.

Если бы я мог знать разницу между возвратом и вводом, то я мог бы избавиться от своего свойства по умолчанию на кнопке ОК и просто нажать обработчик события нажатия кнопки ОК на функции нажатия кнопки формы, но, увы, оба они VK_RETURN .

1 Ответ

18 голосов
/ 23 декабря 2009

Переопределить обработчик сообщений WM_KEYDOWN:

  procedure WMKeyDown(var Message: TWMKeyDown); message WM_KEYDOWN;

Реализуйте его так, чтобы он вызывал предка для чего угодно, кроме того, что вас интересует. Вы можете обнаружить разницу между ключом возврата и ключом ввода по «расширенному» биту в поле сообщения данных ключа:

procedure TForm1.WMKeyDown(var Message: TWMKeyDown);
const
  // Message.KeyData format:
  // [0..15 repCount][16..23 scan code][24 extended bit][25..28 reserved]
  // [29 context][30 previous state][31 transition state]
  KD_IS_EXTENDED = 1 shl 24;
begin
  if Message.CharCode <> VK_RETURN then
  begin
    inherited;
    Exit;
  end;
  if (KD_IS_EXTENDED and Message.KeyData) <> 0 then
    ShowMessage('Keypad Enter')
  else
    ShowMessage('Return');
end;
...