Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
User interface Delphi应用程序主窗体暂时向前滑动_User Interface_Delphi_Hotkeys_Aero - Fatal编程技术网

User interface Delphi应用程序主窗体暂时向前滑动

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

我们有一个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+键热键时,主窗体会向前弹,然后再向后弹。如果处理了热键,则不会发生此行为,可能是因为热键被吞下了

是否有其他人经历过这种行为,并可以建议解决方法


感谢

观察到的行为是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()
,以打破这种所有权。