德尔福:我可以区分小键盘的回车键和回车吗?

时间:2009-12-22 21:09:31

标签: delphi keyboard-input

我有一个古怪的小应用程序弹出一个用Delphi编写的屏幕数字键盘/计算器。我想这样做,如果按下“输入”(在数字键盘上),你按'=',如果你按'返回'(在主键盘上),你就按'确定'。

有一个OK按钮是表单的默认人物,它响应命中输入或返回。 还有一个onkeydown事件处理程序,可能会捕获Enter并返回为vk_return。但它的职责被默认的“确定”按钮篡夺。

如果我能够知道return和enter之间的区别,那么我可以在OK按钮上删除我的默认属性,然后在表单按键功能上点击OK按钮的click事件处理程序,但是它们都是VK_RETURN

1 个答案:

答案 0 :(得分:18)

覆盖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;