当另一个控件拥有焦点时,我的表格如何检测到KeyDown事件?

6
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;

@Abdulrahman - 不用谢。我已经将它作为答案了。 - Sertac Akyuz
如果您有多个表单怎么办? - David Heffernan
那我应该为多个窗体使用 RegisterHotKey API 吗? - RepeatUntil
取决于你想要发生什么。你之前没有回答我的问题。 - David Heffernan
没关系。我觉得你可能没有理解我的问题,但是你可能已经得到了答案。 - David Heffernan
显示剩余4条评论
1个回答

16

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

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

如果 KeyPreview 为 false,则键盘事件只会在活动控件上发生。

导航键(Tab、BackTab、箭头键等)不受 KeyPreview 的影响,因为它们不生成键盘事件。类似地,当一个按钮拥有焦点或其Default属性为true时,Enter键不受 KeyPreview 影响,因为它不会生成键盘事件。

KeyPreview 默认为false。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接