如何在没有焦点的情况下保持表格处理热键?

时间:2013-03-29 12:01:06

标签: forms delphi hotkeys

我们有一个Delphi XE2应用程序。 Form1有热键 Ctrl + F Form2,它是活动的,没有热键。用户在Form2上按 Ctrl + F Form1处理热键。这完全不正确,因为我们看到了非活动表单的活动。我该如何解决?

3 个答案:

答案 0 :(得分:6)

我使用动作实现所有快捷键处理。如果您这样做,那么您可以使用操作,操作列表,操作管理器等提供的集中化来根据表单是否处于活动状态来启用和禁用所有操作。

这样做,例如,通过在表单的StateOnActivate事件处理程序上设置操作列表的OnDeactivate属性:

procedure TMyForm.FormActivate(Sender: TObject);
begin
  ActionList.State := asNormal;
end;

procedure TMyForm.FormDeactivate(Sender: TObject);
begin
  ActionList.State := asSuspended;
end;

答案 1 :(得分:2)

您可以将active form的检查添加到热键处理程序中,即

if(Screen.ActiveForm <> Self)then Exit;

这假设eventhandler是由Form1实现的(然后是Self然后在处理程序中)。

答案 2 :(得分:0)

只需覆盖捕获活动的非活动窗口的以下功能:

function IsShortCut(var Message: TWMKey): Boolean; override;

function TMainForm.IsShortCut(var Message: TWMKey): Boolean;

begin
  if MainForm.Active then
    result := inherited IsShortCut( Message )
  else
    result := false;
end;