User interface Delphi应用程序主窗体暂时向前滑动
我们有一个Delphi 2007应用程序,最近启用了MainFormOnTaskBar以更好地支持Windows Aero。但是,由于单击时主窗体不会位于所有子窗体的顶部,因此我们添加了以下代码User interface Delphi应用程序主窗体暂时向前滑动,user-interface,delphi,hotkeys,aero,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_APPWIN
procedure TBaseForm.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW;
Params.WndParent := 0;
end;
这样做的一个副作用是,当在未处理特定热键的子窗体上按Alt+键热键时,主窗体会向前弹,然后再向后弹。如果处理了热键,则不会发生此行为,可能是因为热键被吞下了
是否有其他人经历过这种行为,并可以建议解决方法
感谢观察到的行为是VCL加速器支持主窗体上可能的主菜单的结果,因此,即使其他窗体处于活动状态,您也可以从主窗体的菜单中选择菜单项 当“应用程序”处理
CM\u APPSYSCOMMAND
消息时,主窗体的激活由主窗体句柄上的SetFocus
调用进行,该消息在命令类型为SC\u KEYMENU
时由“WinControl”(辅助窗体)的WM\u SYSCOMMAND
处理程序发送(窗口菜单激活-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。您不需要重写
CreateParams()
类似于当MainFormOnTaskbar
为true时的情况。基本实现已经为您设置了相同的值。单击MainForm
应该会使其在单击时处于顶部,这是正常的窗口行为。@Remy-当MainFormOnTaskbar为true时,所有辅助窗体都属于主窗体。这会阻止主窗体位于次窗体前面。您可能还会遇到其他问题。解决方案部分提到了一个问题。可能还有其他问题…@SertacAkyuz:“当MainFormOnTaskbar为true时,所有次窗体都归主窗体所有”-这是一个很好的观点,我忘记了这一点。在这种情况下,您必须重写辅助窗体上的CreateParams()
,以打破这种所有权。