Delphi应用程序主表单暂时轻弹到前面

时间:2016-10-12 00:19:01

标签: user-interface delphi hotkeys aero

我们有一个 Delphi 2007 应用程序,并且最近启用了MainFormOnTaskBar以更好地支持Windows Aero。但是,因为主要表单在点击时不会出现在所有子表单的顶部,所以我们添加了以下代码。

procedure TBaseForm.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);

  Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW;
  Params.WndParent := 0; 
end;

这样做的一个副作用是当在不处理该特定热键的子表单上按 Alt + 热键时,主表单会向前滑动然后再回来如果处理了热键,则不会发生此行为,可能是因为吞下了热键。

是否有其他人遇到此行为并可以建议解决方法。

由于

1 个答案:

答案 0 :(得分:5)

观察到的行为是VCL加速器支持主窗体上可能的主菜单的结果,因此即使其他窗体处于活动状态,您也可以从主窗体菜单中选择菜单项。

主表单的激活是通过主表单句柄上的SetFocus调用来实现的,而“Application”正在处理从CM_APPSYSCOMMAND处理器发送的WM_SYSCOMMAND消息。命令类型为SC_KEYMENU时的“WinControl”(辅助表单)(窗口菜单激活 - Alt键)。

请注意,此行为不是使用MainFormOnTaskBar然后重写CreateParams以使表单可以显示在前面的副作用。无论MainFormOnTaskBar的设置如何,都会出现相同的行为。唯一的区别是激活的主窗体在设置时不能出现在辅助窗体的前面,但是主窗体的激活完全相同。

您可以拦截以修改多个位置的行为,例如辅助表单上的WM_SYSKEYDOWN处理程序,或辅助表单的OnKeyDown。在语义上更正确的覆盖,IMO,应该在辅助表单的IsShortCut上完成。如您所知,当辅助表单处理组合键时,系统键的处理将终止。然后,您可以告诉VCL您的表单需要密钥:

type
  TSecondaryForm = class(TForm)
    ..
  public
    function IsShortCut(var Message: TWMKey): Boolean; override;

...

function TSecondaryForm.IsShortCut(var Message: TWMKey): Boolean;
begin
  Result := True;
end;

当然,您可以根据参数进行微调以有条件地返回true。