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;
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.
2条答案
按热度按时间dfty9e191#
Windows实际上在
WM_KEYDOWN
消息中提供了此信息。为此,创建一个新的VCL应用程序,并将
WM_KEYDOWN
消息过程添加到主窗体:实现为
实际上,
WM_KEYDOWN
的文档链接到键盘输入概述,然后是扩展键标志部分:扩展键标志指示击键消息是否源自增强型101/102键键盘上的附加键之一。扩展键由数字键盘中的[...]和ENTER键组成。
a8jjtwal2#
如果有人想要一个与我实现的类似的解决方案,这里有一个UNIT,你可以简单地包括它来使数字键盘上的Enter键返回一个不同的VK_ code:
只需将上述代码保存到HeartWare.Keyboard.PAS中,并将此单元包含在您自己的单元中(例如:主窗体的UNIT),它将安装一个消息钩子,该钩子将数字键盘上的Enter键转换为报告VK_ENTER而不是VK_RETURN。