Delphi: Могу ли я различить клавишу ввода numpad и возврат каретки?
У меня есть странное маленькое приложение, которое выскакивает на экран цифровую панель / калькулятор, написанный на Delphi. Я хотел бы сделать так, чтобы, если бы вы нажали "enter" (на цифровой клавиатуре), вы бы нажали "=", а если бы вы нажали "return" (на основной клавиатуре), вы бы нажали "OK".
Есть кнопка OK, которая является парнем по умолчанию формы, который отвечает на нажатие ввода или возврата. Существует также обработчик события onkeydown, который потенциально может захватывать как Enter, так и возвращаться как 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;