我们有一个 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 + 键热键时,主表单会向前滑动然后再回来如果处理了热键,则不会发生此行为,可能是因为吞下了热键。
是否有其他人遇到此行为并可以建议解决方法。
由于
答案 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。