Delphi 中回车和回车的区别

t8e9dugd  于 2023-05-06  发布在  其他
关注(0)|答案(2)|浏览(143)

This question讲述了如何在JavaScript中实现这一点,但如何在 Delphi 程序中实现呢?

dfty9e19

dfty9e191#

Windows实际上在WM_KEYDOWN消息中提供了此信息。
为此,创建一个新的VCL应用程序,并将WM_KEYDOWN消息过程添加到主窗体:

procedure WMKeyDown(var Message: TWMKeyDown); message WM_KEYDOWN;

实现为

procedure TForm1.WMKeyDown(var Message: TWMKeyDown);
begin
  case Message.CharCode of
    VK_RETURN:
      begin
        if Message.KeyData shr 16 and KF_EXTENDED <> 0 then
          ShowMessage('Enter (numeric keypad) down')
        else
          ShowMessage('Return down')
      end;
  end;
end;

实际上,WM_KEYDOWN的文档链接到键盘输入概述,然后是扩展键标志部分:
扩展键标志指示击键消息是否源自增强型101/102键键盘上的附加键之一。扩展键由数字键盘中的[...]和ENTER键组成。

a8jjtwal

a8jjtwal2#

如果有人想要一个与我实现的类似的解决方案,这里有一个UNIT,你可以简单地包括它来使数字键盘上的Enter键返回一个不同的VK_ code:

UNIT HeartWare.Keyboard;

INTERFACE

USES WinAPI.Windows, WinAPI.Messages;

CONST
  VK_ENTER = $000F; // Unused VK_ keyboard code

IMPLEMENTATION

USES VCL.AppEvnts;

TYPE
  TAppEvents    = CLASS(TApplicationEvents)
                    PROCEDURE   Message(VAR Msg : tagMSG ; VAR Handled : BOOLEAN);
                  END;

{ TAppEvents }

PROCEDURE TAppEvents.Message(VAR Msg : tagMSG ; VAR Handled : BOOLEAN);
  BEGIN
    CASE Msg.message OF
      WM_KEYDOWN : IF (MSG.WParam=VK_RETURN) AND (MSG.LParam SHR 16 AND KF_EXTENDED<>0) THEN MSG.WParam:=VK_ENTER
    END
  END;

INITIALIZATION

  WITH TAppEvents.Create(NIL) DO OnMessage:=Message

END.

只需将上述代码保存到HeartWare.Keyboard.PAS中,并将此单元包含在您自己的单元中(例如:主窗体的UNIT),它将安装一个消息钩子,该钩子将数字键盘上的Enter键转换为报告VK_ENTER而不是VK_RETURN。

相关问题