【问题标题】:How can my form detect KeyDown events when another control has the focus?当另一个控件具有焦点时,我的表单如何检测 KeyDown 事件?
【发布时间】:2015-01-01 20:58:56
【问题描述】:
procedure TMainForm.KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  if (GetKeyState(Ord('Q'))<0) and (GetKeyState(Ord('W'))<0) and (GetKeyState(Ord('E'))<0)
  then ShowMessage('You pressed it');
end;

仅当焦点设置为主窗体时,上述事件才有效。 如果我运行应用程序并继续按 Tab 并将焦点更改为窗体上的任何控件,它将禁用此事件,直到我们再次将焦点更改为主窗体?

问题是 即使焦点不在主窗体中,我如何检测三个键被按下?

我还想如果我使用 RegisterHotKey 但在我的应用程序运行时注册 Q、W 和 E 不是一个好主意。

procedure TMainForm.WMHotKey(var Msg: TWMHotKey);
begin
  if ActiveCaption = 'my Form Caption' then
  Begin
    if Msg.HotKey = HotKey1 then
    begin
      //DoSomething;
    end
    else
    if Msg.HotKey = HotKey2 then
    begin
      //DoSomething;
    end;
  End
  else
   //DoSomething;
end;

【问题讨论】:

  • 您希望在什么情况下处理此按键?如果热键过于全局化,什么是正确的?
  • @SertacAkyuz 我直到现在才知道这件事谢谢我试了一下,它的工作完美,谢谢你拯救了我的一天。
  • @Abdulrahman - 不客气。让它成为一个答案..
  • @DavidHeffernan 谢谢我刚刚将 KeyPreview 属性设置为 Ture 并且它可以工作
  • 如果您有多个表格怎么办?

标签: delphi keydown registerhotkey


【解决方案1】:

您可以将表单的KeyPreview设置为true。

如果KeyPreview 为真,则键盘事件在表单上发生之前 发生在主动控制上。 (主动控制由指定 ActiveControl 属性。)

如果KeyPreview 为假,则键盘事件仅发生在活动 控制。

导航键(Tab、BackTab、箭头键等)是 不受KeyPreview 影响,因为它们不生成键盘 事件。类似地,当一个按钮有焦点或当它的默认 属性为真,回车键不受KeyPreview 的影响,因为 它不会生成键盘事件。

KeyPreview 默认为 false。

【讨论】:

    猜你喜欢
    • 2013-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-24
    • 2015-04-04
    • 1970-01-01
    • 1970-01-01
    • 2014-12-08
    相关资源
    最近更新 更多