在Delphi程序中隐藏主菜单,使用Alt键自动显示

27

首先,我要说的是,我非常讨厌Windows Vista和Windows 7中的这个功能。其次,我想做到这一点。这里有一个问题,询问如何在WPF中实现我想要的功能。

我想做同样的事情,但是在Delphi中使用VCL基础组件,TMainMenu或Action Manager菜单,或者一些可用的第三方组件,甚至是Toolbar2000或其他库。

Windows Vista/Windows 7资源管理器主菜单的特点:

  • 应用程序启动时不可见
  • 按下并释放Alt键使其可见
  • 再次按下并释放Alt键使其不可见
  • 可重复执行
  • 热键在菜单项上起作用,即使菜单不可见*

(* Windows Explorer热键示例:在Microsoft Windows Explorer中,即使菜单不可见,Ctrl+A也会选择所有内容,Alt+T=弹出工具菜单,即使整个菜单都隐藏了)。

enter image description here

更新:使用接受的答案的演示可以在这里下载。(HiddenMenu.zip)


Windows资源管理器有很多功能我讨厌。对已知/注册文件类型隐藏扩展名、“简化的文件共享”以及需要进入9级深度对话框更改NTFS文件权限等是我“最不喜欢”的一些功能。 :-) - Warren P
1个回答

32

像往常一样使用带有 TActionListTMainMenu

然后执行

procedure TForm1.FormShow(Sender: TObject);
begin
  Self.Menu := nil;
end;

(或者在设计时简单地删除 Menu 关联)并且

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if (Key = VK_MENU) or (Key = VK_F10) then
    Menu := MainMenu1;
end;

以及

procedure TForm1.WndProc(var Message: TMessage);
begin
  inherited;
  case Message.Msg of
    WM_EXITMENULOOP:
      SetMenu(Handle, 0);
  end;
end;
不要忘记将表单的KeyPreview设置为true。(请注意,由于快捷键是由TActionList处理的,因此即使菜单“消失”,它们也能正常工作。)

@David:不如我们期望的那样好...如果你点击菜单项,似乎动作没有被触发。我正在处理这个问题... - Andreas Rejbrand
不确定,但是在FormKeyDown的if语句中是否缺少了Key := 0; - Uwe Raabe
@Uwe:不,你也想要默认行为。 - Andreas Rejbrand
按下并释放Alt键使其可见。虽然将OnKeyDown替换为OnKeyUp可能不成问题。 - Andriy M

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接