当子窗体可见时如何防止主菜单操作执行

问题描述

在 MDI VCL 应用程序中,当我显示非模态窗体时,MainForm 菜单键盘快捷键会将焦点切换到 MainForm 并执行菜单项操作 - 这绝不是我想要的。

在早期版本的 Delphi 中,可以覆盖 MainForm 的 IsShortCut() 方法(如 answered here),但这在 Delphi 10.4.2 中不再有效。

我尝试了使用 OnShortCutIsShortCut() 中的 TApplicationTForm 的各种排列,但没有成功。

覆盖非 MainForm 的 IsShortCut() 以对 Alt+ 键盘组合返回 true 确实可以阻止 MainForm 菜单,但它也会阻止操作表单中的本地热键,所以不是很有帮助。

现在有更好的(或任何!)方法来做到这一点吗?

解决方法

我发现当快捷方式被调用时,主窗体(或活动的 MDI 窗体)在测试快捷方式的分配之前调用容器菜单项的 OnClick。所以对我有用的是在菜单项的容器菜单的 OnClick 处理程序中启用菜单项(例如,对于文件菜单上的项目,为文件菜单项本身设置 OnClick 事件)。例如。像这样

procedure TMyForm.FileMenuClick(Sender: TObject);
begin
  MyMenu.Enabled := Screen.ActiveForm = self;  
end;

MyMenu 的相应快捷方式然后不被表单处理,并且可以被活动窗口正确使用。