2012-03-24 58 views
1

好的,我用AppleScript创建了一个小工具,并使用Automator将它变成一个应用程序(MyApp.app)。我想创建一个菜单栏项目(menulet,菜单额外),只需点击它就可以启动MyApp.app。如何创建将启动应用程序的菜单栏项目?

我知道我需要创建一些在/ System/Library/CoreServices/Menu Extras文件夹中的某种.menu文件。

我有Xcode设置,但不是真的知道我需要从哪里开始。我所有的Google搜索都已经显示如何添加和删除Menu Extras文件夹中已有的菜单。

任何提示,技巧,教程或代码赞赏!

编辑:我不想从小脚本菜单栏项目运行AppleScript ...我想要一个单独的菜单栏项目,将启动应用程序。

编辑:我在说右上角的菜单栏,而不是码头。

编辑:我想能够创建一个快捷方式或快速启动按钮到应用程序,以便一个点击菜单栏中的图标将启动该应用程序。我不想或不需要任何与菜单栏项目相关的下拉菜单... one-click =启动应用程序。

+0

我假设你的意思是你想以编程方式做这件事? – Bill 2012-03-24 04:40:41

+0

@Bill如果你的意思是写一个程序来做到这一点,那么是的。但你会怎么做呢? – jsherk 2012-03-24 04:53:14

+0

你只需将它拖到那里。我假设你在谈论码头?如果没有,那么对这个误解抱歉。 – Bill 2012-03-24 04:58:30

回答

1

您正在寻找状态项 - 请参阅Status Bar Programming Topics。一个更老的(Xcode 3,但没有太多)教程可以找到here

+0

我会通读这些。谢谢 – jsherk 2012-03-24 15:25:33

+0

这是第一个答案,似乎有我需要的大部分信息,但它仍不能解释如何制作CoreServices/MenuExtras文件夹中的.menu文件。 – jsherk 2012-03-24 21:28:54

+0

菜单附加功能是一个私人的Apple事物 - 记录的NSStatusItem类并不完全具备所有功能。无论如何,你应该远离/ System文件夹。 – 2012-03-24 21:46:22

1

步骤一步:

  1. 设置Application is agent (UIElement)YES你在info.plist文件
  2. 从乌里Kusterer的网站获取UKLoginItemRegistry,如果你想在菜单在登录显示出来(可选;但这是你最有可能想要做的方式)
  3. 在你的XIB中实现一个NSMenu(带有你需要的项目),并将它作为插座连接(statusMenu),以你的主要应用代表
  4. AppDelegate.m文件设置Status Bar Menu,就像这样:

- (BOOL)isAppSetToRunAtLogon { 
    int ret = [UKLoginItemRegistry indexForLoginItemWithPath:[[NSBundle mainBundle] bundlePath]]; 
    return (ret >= 0); 
} 

- (void) runAtLogon 
{ 
    [UKLoginItemRegistry addLoginItemWithPath:[[NSBundle mainBundle] bundlePath] hideIt: NO]; 
} 

- (void) removeFromLogon 
{ 
    [UKLoginItemRegistry removeLoginItemWithPath:[[NSBundle mainBundle] bundlePath]]; 
} 

-(void)awakeFromNib { 

    if (![self isAppSetToRunAtLogon]) 
    { 
     [self runAtLogon]; 
    } 

    statusItem = [[[NSStatusBar systemStatusBar] statusItemWithLength:NSVariableStatusItemLength] retain]; 
    [statusItem setMenu:statusMenu]; 

    NSImage* statusImage = [[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"YOUR_STATUS_MENU_ICON" ofType:@"icns"]]; 

    [statusImage setSize:NSMakeSize(20, 20)]; 

    [statusItem setImage:[statusImage retain]]; 

    [statusItem setHighlightMode:YES]; 
} 

而且......就是这样! :-)

+0

好吧,比我希望的复杂一点...我在哪里设置我想要运行的应用程序名称,当我点击菜单栏中的图标? – jsherk 2012-03-24 15:25:18

+0

@jsherk Ooops,我实际上并没有明白你的意思。您不会在任何地方设置任何应用程序名称......上面的代码所做的就是在状态栏中设置菜单......就这些了。菜单项所做的操作将通过与平常连接的任何操作(通过Interface Builder)进行定义.. ;-) – 2012-03-24 15:36:55

+0

请勿使用UKLoginItemRegistry。它使用旧的[已弃用](http://developer.apple.com/library/mac/documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/CreatingLoginItems.html)LoginItemsAE实现;现代支持的方式(有两种)在守护进程和服务编程指南中有记载(http://developer.apple.com/library/mac/documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/CreatingLoginItems.html) 。 – 2012-03-24 17:15:50