1

我们有一个 Delphi XE2 应用程序。Form1有热键Ctrl+FForm2,它是活动的,没有热键。用户按下Ctrl+F并处理热键Form2Form1这是完全不正确的,因为我们看到了非活动形式的活动。我如何解决它?

4

3 回答 3

6

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

例如,通过在表单的和事件处理程序State上设置操作列表的属性来做到这一点:OnActivateOnDeactivate

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

procedure TMyForm.FormDeactivate(Sender: TObject);
begin
  ActionList.State := asSuspended;
end;
于 2013-03-29T13:44:43.963 回答
2

您可以在热键处理程序中添加对活动表单的检查,即

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

这是假设事件处理程序由Form1Self然后在处理程序内部)实现的。

于 2013-03-29T13:15:08.253 回答
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;
于 2019-03-10T01:02:13.410 回答