【问题标题】:Escape key is not being detected by my program Delphi [closed]我的程序 Delphi 未检测到转义键 [关闭]
【发布时间】:2012-12-30 21:22:32
【问题描述】:

我希望我的程序检测是否按下了 ESC 键来执行某些操作,但它没有检测到它! 即使焦点设置在另一个组件上,我也想在整个运行时检测转义键按下! 我试过这段代码

if key=#27 then
 begin
  //do something
 end;

有什么建议吗?

【问题讨论】:

  • 您需要更加具体。这段代码在你的程序中在哪里?我确定是某种关键事件,但具体是什么?除非您将 KeyPreview 设置为 true,否则关键事件往往默认为活动控件。
  • @Glenn1234 我在 OnCreate 事件中将 Keypreveiw 设置为 true,此代码在 form1 的 onkeypress 事件中,我按了转义键但没有任何反应!
  • 这就是问题所在。 OnKeyPress 仅适用于字母字符。它需要在 OnKeyDown 或 OnKeyUp 事件中。
  • 假设您想仅在您自己的程序中挂钩转义键,请将您的表单的KeyPreview 属性设置为true
  • 你想检测这个系统范围吗?

标签: delphi keypress


【解决方案1】:

您使用的是哪个事件处理程序?如果它连接到一个控件,当一个键被按下并且 控件 有焦点时会触发该事件。

如果您希望在您的 应用程序 获得焦点的情况下按下某个键时触发该事件,请将 TApplicationEvents 组件拖放到表单上并添加一个 OnMessage 事件处理程序,如下所示:

procedure TfrmMain.ApplicationEvents1Message(var Msg: tagMSG;
  var Handled: Boolean);
begin
  case Msg.message of
    WM_KEYDOWN:
      if Msg.wParam = 27 then
      begin
        // Do something
      end;
  end;
end; 

【讨论】:

  • 我的代码是在 form1 的 onkeypress 事件中编写的,在运行时,当我按下 Escape 时没有任何反应
  • 我收到此错误:[DCC 错误] Unit1.pas(104): E2065 Unsatisfied forward or external declaration: 'TForm1.FormKeyDown'
  • 为什么在没有代码的情况下发布编译器错误?你希望我们做什么?
  • @Billo.S 这不是一个简单的复制粘贴解决方案。 HowTo 是正确的答案,跟着它走。
【解决方案2】:

为了将我上面写的内容正式化为答案,借用 Delphi 3 对 OnKeyDown 的帮助

如果用户按 Esc,以下代码将中止打印作业。请注意,您应该将 KeyPreview 设置为 True,以确保调用 Form1 的 OnKeyDown 事件处理程序。

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
  begin
    if (Key=VK_ESCAPE) and Printer.Printing then
      begin
        Printer.Abort;
        MessageDlg('Printing aborted', mtInformation, [mbOK],0);
      end;
  end;

【讨论】:

  • 它不工作!我使用您的代码在 Escape 键按下时按下按钮,但它不起作用!当焦点不在表单上时它不起作用,它在应用程序被激活时起作用,但如果你按下任何它就不再起作用了!
  • 它在运行时不工作!
  • 嗯,自然只有在表单处于活动状态时才会触发该事件。
  • 好的,所以您再次更改了您的要求,但您并没有真正说明它们。您可以尝试以比目前更清晰的方式陈述它们。
  • @Billo.S:请停止在 cmets 中添加详细信息,并编辑您的问题以澄清您正在尝试做什么。让我们玩 20 个问题来试图弄清楚这不是 StackOverflow 的工作原理。
猜你喜欢
  • 1970-01-01
  • 2013-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-30
  • 1970-01-01
相关资源
最近更新 更多