【问题标题】:How to recognize virtual key codes in KeyPress event? [duplicate]如何识别 KeyPress 事件中的虚拟键码? [复制]
【发布时间】: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 事件,我会将其标记为解决方案。谢谢!
  • 虽然这可能对我和那些提出这个问题的人有帮助:stackoverflow.com/questions/3396754/…
  • 是的,你的问题可以被认为是那个问题的重复(虽然它是关于 JS,但概念是一样的)。 F5 不是字符。

标签: windows delphi vcl


【解决方案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)。
猜你喜欢
  • 1970-01-01
  • 2011-08-18
  • 2016-10-19
  • 1970-01-01
  • 2016-02-17
  • 2010-11-03
  • 2010-11-20
  • 2011-12-29
  • 1970-01-01
相关资源
最近更新 更多