एक स्क्रिप्ट के रूप में कोको-ऐप्पलस्क्रिप्ट या स्क्रिप्ट एडिटर में बनाया गया ऐप्पलस्क्रिप्ट एप्लिकेशन मेनू बार ऐप का समर्थन करता है। यह स्क्रिप्ट macOS 10.12 (शायद 10.10.x, 10.11.x पर चलती है) पर चलती है। इस स्क्रिप्ट को एप्लिकेशन के रूप में सहेजा जा सकता है।
--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:
मैंने पहले मूल का संपादन किया था कोड , Piyomaru द्वारा पोस्ट, बस इस बिंदु पर संकलन करेगा और उदाहरण बनाने के लिए कुछ अतिरिक्त जानकारी जोड़ना चाहता था कोड AppleScript के लिए अपेक्षाकृत नए किसी के लिए अधिक उपयोगी है।
वर्तमान में उदाहरण में कोड , अगर एक के रूप में बचाया आवेदन यह नहीं है कोड पद छोड़ना आवेदन , यह केवल मेनू बार ऑब्जेक्ट को निकालता है। तो, में actionHandler
हैंडलर का लिपि , निम्नलिखित को जोड़ें else
डाली का if
बयान , मौजूदा के बाद कोड :
if (name of current application) is not "Script Editor" then
tell current application to quit
end if
यह स्क्रिप्ट कोड के भीतर से चलने पर / अगर इसे कोडित किया जाता है तो यह स्क्रिप्ट एडिटर को बंद करने का प्रयास नहीं करेगा। आप इसे बिना उपयोग कर सकते हैं if
बयान ब्लॉक करें और उपयोग करें tell current application to quit
यदि आप इसे स्क्रिप्ट संपादक के भीतर से नहीं चलाने जा रहे हैं।
क्योंकि यह लिपि कोको-ऐप्पस्क्रिप्ट का उपयोग कर रहा है, एक बार स्क्रिप्ट एडिटर के भीतर से चलता है, इसे कोको-एप्सस्क्रिप्ट द्वारा बनाई गई सी और ऑब्जेक्टिव-सी पॉइंटर्स को फ्लश करने के लिए सहेजने से पहले फिर से संकलित किया जाना चाहिए कोड , क्योंकि संकेत स्क्रिप्ट में सहेजे नहीं जा सकते। टूलबार पर हथौड़ा आइकन पर क्लिक करें, या: स्क्रिप्ट संपादक & gt; स्क्रिप्ट और जी.टी. संकलन ⌘K
इसके अतिरिक्त, जब एक के रूप में बचाया आवेदन आप अवश्य देखें रन हैंडलर के बाद खुले रहें चेक-बॉक्स इसे सहेजते समय, और डिफ़ॉल्ट रूप से ऐप का डॉक टाइल चलने पर डॉक में दिखाई देगा। चूंकि यह मेनू बार ऐप के लिए अवांछित व्यवहार हो सकता है, इसलिए निम्न का उपयोग करें आदेश आवश्यक जोड़ने के लिए टर्मिनल में कुंजी ऐप के लिए Info.plist फ़ाइल इसलिए यह डॉक में नहीं दिखाई देगा।
defaults write /Applications/name_of_app.app/Contents/Info.plist LSUIElement -bool yes
- बदलने के
name_of_app
वास्तविक नाम के साथ आपने इसे सहेजा है, और यदि आवश्यक हो तो पथ को बदलें यदि नहीं /Applications
।
- ध्यान दें कि यदि आप डॉक पर एप्लिकेशन को खींचते हैं, तो इसकी डॉक टाइल अभी भी डॉक पर दिखाई देगी, बस खुले होने पर इसके नीचे एक खुला संकेतक नहीं होगा। यह जोड़ा गया कुंजी Info.plist फ़ाइल को डॉक पर दिखाते समय डॉक टाइल को चालू रखने के लिए है, जब एप्लिकेशन को पहली बार डॉक पर नहीं घसीटा गया है।
में actionHandler
हैंडलर मूल उदाहरण का कोड , यह सिर्फ मेनू आइटम नंबर के साथ एक संवाद बॉक्स प्रदर्शित करता है जिसे क्लिक किया गया था, जो निश्चित रूप से उदाहरण के लिए ठीक है कोड हालाँकि, मैं एक अलग उदाहरण दिखाना चाहता हूँ कि कैसे अलग है कोड किस मेनू आइटम पर क्लिक किया गया। निम्न उदाहरण कोड पूरी जगह ले सकता है actionHandler
हैंडलर मूल रूप में लिपि :
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:
अब इसे अलग तरह से लिखा जा सकता है, यानी "क्विट" ए else
या else if
नीचे, लेकिन मैंने इसे इस तरह से किया क्योंकि मैं चाहता हूं कि अन्य सभी मेनू कमांड ए हो else if
विकल्प, भले ही तार्किक रूप से किसी अन्य दिए गए मेनू कमांड को क्लिक करने की अधिक संभावना है, फिर "छोड़ो"। मेरे लिए, मुझे लगता है कि मेनू कमांड को जोड़ना / संपादित करना / हटाना आसान है कोड जब इस तरह से लिखा है। यह सिर्फ एक व्यक्तिगत प्राथमिकता है, इसलिए इसे आप जैसा महसूस करते हैं, आपके लिए सही है।
AppleScript भाषा गाइड से एक चर्चा नोट:
एक अगर कथन में कोई भी संख्या हो सकती है और अगर खंड; AppleScript पहले बूलियन अभिव्यक्ति के लिए एक में निहित दिखता है अगर या और अगर क्लॉज वह है सच , इसके ब्लॉक में निहित कथनों (एक के बीच के कथनों) को निष्पादित करता है और अगर और निम्नलिखित और अगर या अन्य खंड), और फिर बाहर निकलता है अगर बयान।
एक अगर बयान में एक अंतिम भी शामिल हो सकता है अन्य खंड। यदि कोई अन्य परीक्षण नहीं करता है तो इसके ब्लॉक के कथनों को निष्पादित किया जाता है अगर स्टेटमेंट पास
मूल उदाहरण कोड के अधिकांश भाग के लिए, आपको केवल कोड की दो पंक्ति को संशोधित करना होगा init
हैंडलर :
set aList to {"Piyomaru", "Software", "", "Takaaki", "Naganoya", "", "Quit"}
- यह उनके क्रम में मेनू कमांड का नाम सेट करता है, और
""
एक विभाजक के लिए है।
एक अलग आइकन के लिए:
aStatusItem's setTitle:"🚗"
- "कुछ और जिसे आप पसंद करते हैं, उससे बदलें: स्क्रिप्ट संपादक & gt; संपादित करें & gt; इमोजी और amp; प्रतीक
उम्मीद है कि यह स्पष्ट है कि if
में बयान ब्लॉक actionHandler
हैंडलर के अनुरूप होगा aList
में init
हैंडलर , इसलिए नामों का मिलान करें aTitle is equal to
में actionHandler
हैंडलर में नाम के लिए aList
में init
हैंडलर ।
का बाकी कोड को संशोधित करने की आवश्यकता नहीं होनी चाहिए, हालांकि यह निश्चित रूप से आवश्यकता हो सकती है या चाहिए।