如何识别 KeyPress 事件中的虚拟键码? [复制]

Posted

技术标签:

【中文标题】如何识别 KeyPress 事件中的虚拟键码? [复制]【英文标题】:How to recognize virtual key codes in KeyPress event? [duplicate] 【发布时间】:2021-03-14 17:16:52 【问题描述】:

我正在尝试实现类似于记事本在用户按 F5 键时插入日期和时间的功能。在活动中

procedure TFormMain.Memo1KeyPress(Sender: TObject; var Key: Char);

代码

  if Key=Chr(VK_F5) then
  begin
    Memo1.Lines.Add(FormatDateTime('h:nn',now));
  end;

没有效果。同样的方法,

  if Key=Chr(VK_ESCAPE) then
  //do something

做某事。

当用户按下 F5 时,我需要做什么才能让应用程序识别?

【问题讨论】:

改用 KeyDown 事件。 @Olivier 这行得通!如果您要发布回复,也许会简要说明为什么使用 KeyDown 与 KeyPress 事件,我会将其标记为解决方案。谢谢! 虽然这可能对我和那些提出这个问题的人有帮助:***.com/questions/3396754/… 是的,你的问题可以被认为是那个问题的重复(虽然它是关于 JS,但概念是一样的)。 F5 不是字符。 【参考方案1】:

来自帮助表单 TMemo KeyPress 事件:

与 ASCII 字符值不对应的键(SHIFT 或 F1,例如 例如)不要生成 OnKeyPress 事件。

F5 是这些键之一。请尝试使用 OnKeyDown 事件。

procedure TForm1.Memo1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if Key = VK_ESCAPE then
    Memo1.Lines.Add('Escape')
  else if Key = VK_F5 then
    Memo1.Lines.Add('F5');
end;

【讨论】:

奇怪的是KeyPress事件仍然识别VK_ESCAPE。 @AlC Escape 不是常规字符,而是control character(ASCII 码为 27)。

以上是关于如何识别 KeyPress 事件中的虚拟键码? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何检测 angular.js 中的 keydown 或 keypress 事件?

如何将虚拟键码转换为字符码?

C#如何将虚拟键码转换为字符?

如何忽略 Swing 中的按键事件?

javascript事件的类型整理

jquery键盘事件总结