The*_*oon 4 delphi user-interface 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;
Run Code Online (Sandbox Code Playgroud)
这样做的一个副作用是当在不处理该特定热键的子表单上按下Alt+ key热键时,主表单向前轻弹然后再向后.如果处理热键,则不会发生此行为,可能是因为吞下了热键.
有没有其他人经历过这种行为,可以建议一个解决方法.
谢谢
观察到的行为是VCL加速器支持主窗体上可能的主菜单的结果,因此即使其他窗体处于活动状态,您也可以从主窗体菜单中选择菜单项.
通过SetFocus调用主窗体的句柄来激活主窗体,而"应用程序"处理CM_APPSYSCOMMAND从WM_SYSCOMMAND命令类型为SC_KEYMENU(窗口菜单激活 - Alt )时从"WinControl"(辅助窗体)的处理程序发送的消息键).
请注意,此行为不是使用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;
Run Code Online (Sandbox Code Playgroud)
当然,您可以根据参数进行微调以有条件地返回true.
| 归档时间: |
|
| 查看次数: |
189 次 |
| 最近记录: |