Delphi: Могу ли я различать ключ ввода numpad и возврат каретки?

У меня есть причудливое маленькое приложение, которое выведет на экран номерной номер/калькулятор, написанный в Delphi. Я бы хотел сделать так, если вы нажмете 'enter' (на цифровой клавиатуре), вы будете нажимать "=", и если вы нажмете "return" (на главной клавиатуре), вы нажмете "OK".

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

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

Ответ 1

Переопределите обработчик сообщения 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;