使用 Applescript 创建一个简单的菜单栏应用程序

Creating a simple menubar app using Applescript

我正在尝试在 OS X Yosemite 中创建一个菜单栏应用程序,它只包含一个带有子菜单的下拉菜单。此菜单及其子菜单将由 applescript 脚本填充。

我以前找到过类似的教程,但它们似乎都已经过时并且不能在 Xcode 6.2 中正常工作,例如这个:

MenuApp_ASOC

我在 Applescript 方面相当有经验,但没有太多时间在 Objective C 中编写代码。

哪里可以找到我想要创建的各种模板?

我鼓励您访问位于 http://macscripters.net 的 ASOC 论坛,那里的人可能会回答您关于如何使用 XCode 6.2 的问题。但是你必须努力记录你得到的 problems/errors 当然,仅仅 "not working" 不足以解决你的问题。

这就是您无论如何都必须做的,除非您很高兴找到适用于 XCode 项目的菜单应用程序。

在 macscripters 中,http://macscripter.net/viewtopic.php?id=38891&p=1 有一个由 DJ Bazzie Wazzie 制作的更小的菜单应用程序项目,它可能更容易制作。您可以在该线程或 ASOC 论坛中解决任何问题。

Shane Stanley,两本 ASOC 好书的作者和 ASOC 编辑经常访问那里的论坛,他是一个非常乐于助人和善良的人!

这是动态创建菜单系统的快速示例。这就是我认为你想要的。

在此示例中,每次单击“状态栏”菜单时,菜单项都会不同。

(需要Yosemite)

将此代码粘贴到新的脚本编辑器 Applescript 文档中。

使用“另存为...”菜单选项将其另存为“保持打开状态的应用程序”。

然后 运行 该应用程序作为普通应用程序。

    use AppleScript version "2.4"
use scripting additions
use framework "Foundation"
use framework "AppKit"

property StatusItem : missing value
property selectedMenu : "" -- each menu action will set this to a number, this will determin which IP is shown

property theDisplay : ""
property defaults : class "NSUserDefaults"
property internalMenuItem : class "NSMenuItem"
property externalMenuItem : class "NSMenuItem"
property newMenu : class "NSMenu"

property theList : "Jackson Aiden Liam Lucas Noah Mason Ethan Caden Jacob Logan Jayden Elijah Jack Luke Michael Benjamin Alexander "
-- example list for the menu items that can be used. Ideally you will have your list created dynamically 


-- check we are running in foreground - YOU MUST RUN AS APPLICATION. to be thread safe and not crash
if not (current application's NSThread's isMainThread()) as boolean then
    display alert "This script must be run from the main thread." buttons {"Cancel"} as critical
    error number -128
end if

on menuNeedsUpdate:(menu)
    (* NSMenu's delegates method, when the menu is clicked this is called.

    We use it here to call the method makeMenus(). Which removes the old menuItems and builds new ones.

    This means the menu items can be changed dynamically.

    *)

    my makeMenus()
end menuNeedsUpdate:

on makeMenus()

    newMenu's removeAllItems() -- remove existing menu items

    -----< (* this is just to show in this example a dynamic list for the menu items
    set someListInstances to {}
    set counter to count of word of theList
    repeat until (count of someListInstances) is (random number from 3 to counter)

        set rnd to random number from 1 to counter
        set thisItem to word rnd of theList
        if thisItem is not in someListInstances then
            copy thisItem to end of someListInstances
        end if
    end repeat
    ----  <

    repeat with i from 1 to number of items in someListInstances
        set this_item to item i of someListInstances
        set thisMenuItem to (current application's NSMenuItem's alloc()'s initWithTitle:this_item action:"someAction:" keyEquivalent:"")

        (newMenu's addItem:thisMenuItem)

        (thisMenuItem's setTarget:me) -- required for enabling the menu item
        if i is equal to 3 then
            (newMenu's addItem:(current application's NSMenuItem's separatorItem)) -- add a seperator
        end if
    end repeat

end makeMenus



--menuItems  action is requied for the menu to be enabled
on someAction:sender
    --MenuItem --do some thing 
end someAction:

-- create an NSStatusBar
on makeStatusBar()
    set bar to current application's NSStatusBar's systemStatusBar

    set StatusItem to bar's statusItemWithLength:-1.0

    -- set up the initial NSStatusBars title
    StatusItem's setTitle:"IP"
    -- set up the initial NSMenu of the statusbar
    set newMenu to current application's NSMenu's alloc()'s initWithTitle:"Custom"

    newMenu's setDelegate:me (*
    Requied delegation for when the Status bar Menu is clicked  the menu will use the delegates method (menuNeedsUpdate:(menu)) to run dynamically update.


    *)

    StatusItem's setMenu:newMenu

end makeStatusBar


my makeStatusBar()