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

Objective c 如何创建将启动应用程序的菜单栏项?,objective-c,macos,cocoa,osx-lion,osx-snow-leopard,Objective C,Macos,Cocoa,Osx Lion,Osx Snow Leopard,好的,我用AppleScript创建了一个小实用程序,并使用Automator将其转换为一个应用程序(MyApp.app)。我想创建一个菜单栏项(menulet,Menu extra),当你点击它时,它会启动MyApp.app 我知道我需要创建某种.menu文件,该文件位于/System/Library/CoreServices/menu Extras文件夹中 我有Xcode设置,但不确定从哪里开始。我在谷歌上搜索到的只是如何添加和删除菜单附加文件夹中已有的菜单项 任何提示、提示、教程或代码都将

好的,我用AppleScript创建了一个小实用程序,并使用Automator将其转换为一个应用程序(MyApp.app)。我想创建一个菜单栏项(menulet,Menu extra),当你点击它时,它会启动MyApp.app

我知道我需要创建某种.menu文件,该文件位于/System/Library/CoreServices/menu Extras文件夹中

我有Xcode设置,但不确定从哪里开始。我在谷歌上搜索到的只是如何添加和删除菜单附加文件夹中已有的菜单项

任何提示、提示、教程或代码都将不胜感激

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

编辑:我指的是右上角的菜单栏,不是码头


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

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

一步一步:

  • 在您的in
    info.plist文件中将
    应用程序是代理(UIElement)
    设置为
    YES
  • 如果您想在登录时显示菜单,请从Uli Kusterer的网站获取(可选;但这是您最希望的方式)
  • 在XIB中实现NSMenu(包含您需要的项目),并将其作为插座(
    statusMenu
    )连接到主应用程序代理
  • AppDelegate.m
    文件中设置
    状态栏菜单,如下所示:


  • 而且。。。就这样!:-)

    我想你的意思是你想通过编程来做这件事?@Bill如果你的意思是写一个程序来做这件事,那么是的。但是你怎么做呢?你只要把它拖到那里就行了。我猜你说的是码头?如果不是的话,我对误会感到抱歉。不,不是码头。。我说的是右上角的菜单栏,时钟就在那里。好吧,比我想象的要复杂一点。。。当我单击菜单栏中的图标时,我要在哪里设置要运行的应用程序名?@jsherk Ooops,我实际上不明白你上面的意思。您没有设置任何应用程序名称。。。在任何地方上面的代码所做的是在状态栏中设置一个菜单。。。这就是全部。菜单项的功能将由您连接到它们的任何操作(通过Interface Builder)定义,与往常一样…-)不要使用UKLoginItemRegistry。它使用旧的LoginItemsAE实现;支持的现代方式(有两种)都有文档记录。我不想要菜单项(没有下拉列表)。。。只需单击图标(第一次单击)即可启动一个应用程序,该应用程序将在编译前的某个地方在代码中指定。@jsherk:然后不要给状态项提供菜单。设置状态项的目标和操作。这是第一个答案,似乎包含了我需要的大部分信息,但是,它仍然没有解释如何创建一个.menu文件,该文件位于CoreServices/MenuExtras文件夹中。菜单附加是苹果公司的一项私有内容——有文档记录的NSStatusItem类并没有所有的功能。在任何情况下,您都应该远离/System文件夹。因此,我会创建一个单独的应用程序,在运行时,它会创建一个菜单栏项(作为其自身的一部分),然后单击该菜单栏项将启动我想要的另一个应用程序?是的-您可以将其添加到登录项中,以便在登录后立即开始运行。它不一定需要是一个单独的应用程序,它可以是您的应用程序的一部分,在单击状态项时执行它的操作。
    - (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];
    }