如何制作类似Finder的Dock菜单?

时间:2011-06-13 12:40:08

标签: cocoa

当用户在正在运行的应用程序上用鼠标右键(或命令按钮+鼠标单击)点击Dock图标时 - 他可以看到Dock菜单。通常由3部分组成:

http://i55.tinypic.com/i1for6.png

此应用程序打开的所有文档的列表(红色),自定义应用程序的菜单部分(黄色)以及隐式添加到所有项目的默认项目(蓝色)。

Here apple解释说我们可以通过实现应用程序委托的方法‑(NSMenu *)applicationDockMenu:(NSApplication *)sender来定义这些自定义项(黄色),该方法应返回有效菜单(或通过在Interface Builder中定义此Dock菜单)。

如果您尝试打开Finder的停靠菜单,则可以看到一个不寻常的菜单:

Unusual menu

这是不寻常的,因为它没有用于退出的普通项目和“选项”子菜单 - 正如任何其他已启动的应用程序默认具有的那样。相反,它只有“隐藏”。

我非常确定应用程序或nib文件可以覆盖Dock菜单的默认“系统”(蓝色)部分。也许有人知道如何实现这一目标?

我正在开发一个安全应用程序,不应该被允许退出或选择在“登录时”启动,但它应该在用户登录时一直运行(就像Finder一样,它可能只是暂停使用强制应用于退出或活动监视器)。我有充分的理由想要摆脱它。我知道这不是Mac OS的方式,但这并不是一个普通的应用程序。 有没有人做过类似的事情?

谢谢

4 个答案:

答案 0 :(得分:1)

这很简单:在nib文件中创建一个菜单,然后将NSApplication的{​​{1}}插座连接到该菜单。您可以找到更多信息here

或者您可以通过代码将菜单项添加到现有菜单中。您可以使用dockMenu获取现有的停靠菜单,并以编程方式添加项目。

答案 1 :(得分:1)

Dock菜单实际上是由Dock进程本身提供的,它只是代理每个应用程序的dockMenus,所以你不能直接对它做任何事情。

可行的方法是:安装Quartz事件点击,拦截路由到Dock进程的点击,检查它是否在您自己的应用程序图标上,然后打开您自己的自定义菜单。棘手,并且根本不可能用于沙盒应用。

答案 2 :(得分:0)

Finder的菜单很特别,因为Finder本身很特别:它不能退出,它必须始终保留在Dock中,必须在登录时打开,并且您无法在Finder中显示Finder的位置。

您正在寻找的东西根本不存在。没有办法做到这一点。没有应用程序可以覆盖此区域。

答案 3 :(得分:-1)

您是否可以将LSUIElement密钥集YES添加到应用的Info.plist文件中,而不是使用停靠菜单?这将阻止您的应用程序出现在Dock中。

但是,它也会阻止它有一个菜单栏。