如何在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
相关产品推荐
相关产品推荐

