如何创建将启动应用程序的菜单栏项?

时间:2012-03-24 04:20:48

标签: objective-c macos cocoa osx-lion osx-snow-leopard

好的,我用AppleScript创建了一个小实用工具,并使用Automator将其转换为应用程序(MyApp.app)。我想创建一个菜单栏项(菜单项,菜单附加),只需单击它即可启动MyApp.app。

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

我有Xcode设置,但不确定我需要从哪里开始。我所有的谷歌搜索都显示了如何在Menu Extras文件夹中添加和删除现有的菜单。

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

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

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

编辑:我希望能够为应用程序创建快捷方式或快速启动按钮,这样只需单击菜单栏中的图标即可启动应用程序。我不想要或不需要与菜单栏项关联的任何下拉菜单...一键=启动应用程序。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

循序渐进:

  1. Application is agent (UIElement)文件
  2. 中将YES设为info.plist
  3. 从Uli Kusterer的网站获取UKLoginItemRegistry,如果您希望菜单显示在LogOn上(可选; ,但这是您最有可能想要这样做的方式)
  4. 在您的XIB中实施NSMenu(包含您需要的项目)并将其作为插座(statusMenu)连接到您的主应用代表
  5. Status Bar Menu文件中设置AppDelegate.m,如下所示:

  6. - (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];
    }
    

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