You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Delphi中区分ENTER键与RETURN键?

在Delphi中区分主键盘Return键与小键盘Enter键

主键盘的Return键和小键盘的Enter键,在Windows系统里虚拟键码都是VK_RETURN(十六进制$0D),没法直接通过Delphi键盘事件的Key参数区分,得靠扫描码来识别二者差异。

实现方法

方法一:利用OnKeyDown事件+扫描码

给需要监听的控件(比如TEdit、TForm)绑定OnKeyDown事件,在事件里通过GetKeyState获取扫描码判断:

procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
var
  ScanCode: Word;
begin
  if Key = VK_RETURN then
  begin
    // 扫描码存于GetKeyState返回值的高字节
    ScanCode := HiWord(GetKeyState(VK_RETURN));
    // 主键盘Return扫描码为$1C,小键盘Enter为$9C
    if ScanCode = $1C then
      ShowMessage('按下主键盘Return键')
    else if ScanCode = $9C then
      ShowMessage('按下小键盘Enter键');
  end;
end;

方法二:重写WM_KEYDOWN消息

如果需要更底层的处理,可重写控件或窗体的WM_KEYDOWN消息响应,直接读取消息中的扫描码:

type
  TForm1 = class(TForm)
    Edit1: TEdit;
  private
    procedure WMKeyDown(var Message: TWMKeyDown); message WM_KEYDOWN;
  public
  end;

implementation

procedure TForm1.WMKeyDown(var Message: TWMKeyDown);
begin
  inherited;
  if Message.CharCode = VK_RETURN then
  begin
    if Message.ScanCode = $1C then
      ShowMessage('触发主键盘Return键')
    else if Message.ScanCode = $9C then
      ShowMessage('触发小键盘Enter键');
  end;
end;

注意点

  • 少数特殊键盘布局可能扫描码有差异,建议在目标设备上测试
  • OnKeyPress事件没法区分这两个键,因为它只传递字符编码#13
  • 如果系统开启了辅助功能里的"小键盘模拟主键盘",扫描码判断可能失效

内容的提问来源于stack exchange,提问作者HeartWare

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 21:57:19