Bir komut dosyası olarak Cocoa-AppleScript veya Script Editor'da oluşturulan AppleScript uygulaması Menü Çubuğu uygulamasını destekler. Bu betik macOS 10.12'de çalışır (belki 10.10.x, 10.11.x'te çalışır). Bu script uygulama olarak kaydedilebilir.
--AppleScript: menu bar script -- Created 2017-03-03 by Takaaki Naganoya
--2017 Piyomaru Software
use AppleScript version "2.4"
use scripting additions
use framework "Foundation"
use framework "AppKit"
--http://piyocast.com/as/archives/4502
property aStatusItem : missing value
on run
init() of me
end run
on init()
set aList to {"Piyomaru", "Software", "", "Takaaki", "Naganoya", "", "Quit"}
set aStatusItem to current application's NSStatusBar's systemStatusBar()'s statusItemWithLength:(current application's NSVariableStatusItemLength)
aStatusItem's setTitle:"🚗"
aStatusItem's setHighlightMode:true
aStatusItem's setMenu:(createMenu(aList) of me)
end init
on createMenu(aList)
set aMenu to current application's NSMenu's alloc()'s init()
set aCount to 1
repeat with i in aList
set j to contents of i
if j is not equal to "" then
set aMenuItem to (current application's NSMenuItem's alloc()'s initWithTitle:j action:"actionHandler:" keyEquivalent:"")
else
set aMenuItem to (current application's NSMenuItem's separatorItem())
end if
(aMenuItem's setTarget:me)
(aMenuItem's setTag:aCount)
(aMenu's addItem:aMenuItem)
if j is not equal to "" then
set aCount to aCount + 1
end if
end repeat
return aMenu
end createMenu
on actionHandler:sender
set aTag to tag of sender as integer
set aTitle to title of sender as string
if aTitle is not equal to "Quit" then
display dialog aTag as string
else
current application's NSStatusBar's systemStatusBar()'s removeStatusItem:aStatusItem
end if
end actionHandler:
Orijinali daha önce düzenledim kod , Piyomaru tarafından yayınlanan, derleyeceği noktaya, örnek oluşturmak için bazı ek bilgiler eklemek istedi kod AppleScript için nispeten yeni olan herkes için daha kullanışlıdır.
Halen örnekte kod olarak kaydedilmişse, uygulama yok kod istifa etmek uygulama , yalnızca menü çubuğu nesnesini kaldırır. Yani, içinde actionHandler
işleyicisi arasında senaryo , aşağıdakileri ekleyin else
şube arasında if
Beyan , mevcut olandan sonra kod :
if (name of current application) is not "Script Editor" then
tell current application to quit
end if
Kodlanır, böylece / Kod Düzenleyici içinden çalıştırıldığında Kod Düzenleyiciyi kapatmaya çalışmaz. Olmadan kullanabilirsiniz if
Beyan engelle ve kullan tell current application to quit
Komut Dosyası Düzenleyicisi'nden çalıştırmayacaksanız.
Çünkü bu senaryo Cocoa-AppleScript kullanıyor, bir kez Script Editor içinden çalıştırıldığında, Cocoa-Applescript tarafından oluşturulan C ve Objective-C işaretçilerinin yıkanması için kaydetmeden hemen önce tekrar derlenmesi gerekir. kod , işaretçiler komut dosyasında kaydedilemediğinden. Araç Çubuğundaki çekiç simgesine tıklamanız yeterlidir: Komut Dosyası Düzenleyicisi & gt; Komut Dosyası & gt; Derlemek ⌘K
Ayrıca, uygulama kontrol etmelisin Çalıştırıcıdan sonra açık kal check-box onu kaydederken ve varsayılan olarak uygulamanın Dock Tile çalışırken Dock'ta görünecektir. Bir menü çubuğu uygulaması için istenmeyen davranış olabileceğinden, aşağıdakileri kullanın komuta Gerekli eklemek için Terminal anahtar uygulamanın Info.plist Dock'ta görünmeyecek şekilde dosya.
defaults write /Applications/name_of_app.app/Contents/Info.plist LSUIElement -bool yes
- değiştirmek
name_of_app
asıl ismi ile kaydettiğinizde, gerekirse /Applications
.
- Uygulamayı Dock'a sürüklerseniz, Dock Tile hala Dock'ta görünecek, açıkken altında açık bir gösterge olmayacağını unutmayın. Bu eklendi anahtar Info.plist dosyasına göre, uygulama ilk önce Dock'a sürüklenmemişken Dock Tile'in Dock'ta görünmesini engellemektir.
İçinde actionHandler
işleyicisi Orijinal örneğin kod , yalnızca tıklanan menü öğesi numarasına sahip bir iletişim kutusu görüntüler; kod Bununla birlikte, nasıl ayrılacağına dair farklı bir örnek göstermek istiyorum. kod hangi menü öğesinin tıklandığına bağlı olarak yürütülür. Aşağıdaki örnek kod tüm yerini alabilir actionHandler
işleyicisi orjinalinde senaryo :
on actionHandler:sender
set aTitle to title of sender as string
if aTitle is equal to "Quit" then
current application's NSStatusBar's systemStatusBar()'s removeStatusItem:aStatusItem
if (name of current application) is not "Script Editor" then
tell current application to quit
end if
else if aTitle is equal to "Piyomaru" then
-- # Your code to run for this menu choice goes here:
else if aTitle is equal to "Software" then
-- # Your code to run for this menu choice goes here:
else if aTitle is equal to "Takaaki" then
-- # Your code to run for this menu choice goes here:
else if aTitle is equal to "Naganoya" then
-- # Your code to run for this menu choice goes here:
end if
end actionHandler:
Şimdi bu farklı bir şekilde yazılabilir, yani bir "Çık" else
veya else if
dibinde, ancak bu şekilde yaptım çünkü diğer tüm menü komutlarının bir else if
Seçim, mantıksal olarak verilen herhangi bir menü komutunun tıklanma olasılığının daha yüksek olmasına rağmen "Çık". Benim için menü komutlarını eklemek / düzenlemek / kaldırmak daha kolay. kod bu şekilde yazıldığında. Bu sadece kişisel bir tercih, bu yüzden sizin için neyin doğru olduğunu hissettiğiniz gibi yapın.
AppleScript Dil Kılavuzu'ndan bir tartışma notu:
bir Eğer deyimi herhangi bir sayıda içerebilir aksi takdirde maddeleri; AppleScript, içinde bulunan ilk Boolean ifadesini arar. Eğer veya aksi takdirde yan tümce doğru , bloğunda yer alan ifadeleri çalıştırır (bir ifadeler arasında aksi takdirde ve aşağıdaki aksi takdirde veya Başka yan tümce), ve sonra çıkar Eğer Beyan.
bir Eğer deyimi ayrıca bir final içerebilir Başka fıkra. Bloğundaki ifadeler, eğer başka test yoksa Eğer deyim geçer.
Orijinal örnek kodun çoğu için, kodun sadece iki satırını değiştirmeniz gerekir. init
işleyicisi :
set aList to {"Piyomaru", "Software", "", "Takaaki", "Naganoya", "", "Quit"}
- Bu, menü komutlarının adını sıralarına göre ayarlar ve
""
bir ayırıcı içindir.
Farklı bir simge için:
aStatusItem's setTitle:"🚗"
- "" İfadesini tercih ettiğiniz başka bir şeyle değiştirin: Komut Dosyası Düzenleyici & gt; Düzenle & gt; Emoji ve amp; Semboller
Umarım ki belli if
deyim bloğunda actionHandler
işleyicisi karşılık gelecek aList
içinde init
işleyicisi , yani aTitle is equal to
içinde actionHandler
işleyicisi adlarına aList
içinde init
işleyicisi .
Gerisi kod İhtiyaç duyulması veya istenmesi halinde kesinlikle mümkün olmasına rağmen, değiştirilmeye gerek yoktur.