มีวิธีให้ AppleScript แสดงผลในแถบเมนูหรือไม่?


8

ก่อนที่จะอ่านเพิ่มเติม: ฉันรู้เกี่ยวกับบัตเลอร์และโปรแกรมที่คล้ายกัน ฉันกำลังมองหาวิธีที่จะทำสิ่งนี้โดยไม่ต้องใช้แอพของบุคคลที่สาม

อย่างไรก็ตามฉันเขียน AppleScript ที่รันคำสั่งเชลล์ ฉันต้องการแสดงผลลัพธ์นั้นในแถบเมนูด้านบน ... โดยไม่มีบัตเลอร์ฉันจะทำสิ่งนี้ได้อย่างไร


เนื่องจากAppleScriptObjCเป็นส่วนหนึ่งของ macOS (2014) จึงเป็นไปได้ที่จะใช้เฟรมเวิร์ก "Foundation" (รวมถึงวิธีการของ NSMenu) เพื่อให้บรรลุสิ่งที่อาจเป็นไปไม่ได้ในปี 2555 . . . . ดูคำตอบของฉันด้านล่างเกี่ยวกับวิธีการทำมัน!
clemsam lang

คำตอบ:


2

โดยทั่วไปแล้วหากไม่มีโปรแกรมของบุคคลที่สามเช่น Growl จึงไม่มีวิธีสร้างสิ่งนี้

อย่างไรก็ตามคุณสามารถเขียนสคริปต์หรือโปรแกรมอื่น ๆ เช่นที่ฉันพบที่นี่ที่ให้บริการเมนูสำหรับคุณ ฉันแน่ใจว่าการรวมเข้าด้วยกันของ Growl จะทำได้ง่ายกว่ามาก


1

ไม่มีวิธีในการทำสิ่งนี้ใน OS X อย่างไรก็ตามเมื่อใช้Growlคุณสามารถมีการแจ้งเตือนได้ นี่เป็นสคริปต์ตัวอย่างสำหรับสิ่งนั้น:

--Make sure Growl is running
tell application "System Events"
    set isRunning to (count of (every process whose bundle identifier is "com.Growl.GrowlHelperApp")) > 0
end tell

if isRunning then
    tell application id "com.Growl.GrowlHelperApp"
        set the allNotificationsList to ¬
            {"Test Notification", "Another Test Notification"}
        --Notifications can be enabled in System Preferences>Growl>Applications>Display Options
        set the enabledNotificationsList to ¬
            {"Test Notification"}
        register as application ¬
            "Growl AppleScript Sample" all notifications allNotificationsList ¬
            default notifications enabledNotificationsList ¬
                    -- Set the icon. You can use any icon from any application
            icon of application "AppleScript Editor"

        notify with name ¬
            "Test Notification" title ¬
            "Test Notification" description ¬
            "This is a test AppleScript notification." application name "Growl AppleScript Sample"

        notify with name ¬
            "Another Test Notification" title ¬
            "Another Test Notification :) " description ¬
            "Alas — you won't see me until you enable me..." application name "Growl AppleScript Sample"

    end tell
end if

ที่ควรแสดงสิ่งนี้:

และหากคุณเปิดใช้งานการแจ้งเตือนอื่นด้วย:

เทคนิคขั้นสูงเพิ่มเติมได้อธิบายไว้ที่นี่


1

เนื่องจากAppleScriptObjCเป็นส่วนหนึ่งของ macOS จึงเป็นไปได้ที่จะใช้เฟรมเวิร์ก "พื้นฐาน" (รวมถึงวิธีการของ NSMenu) เพื่อให้บรรลุสิ่งที่อาจเป็นไปไม่ได้ในปี 2555

ฉันพบสคริปต์ที่น่าสนใจในการสร้างเมนูที่กำหนดเองจากภายใน AppleScript; จากนี้ฉันสกัดรหัสที่เหมาะสมกับข้อความที่เกิดขึ้นในแถบเมนูของ MacOS อันที่จริงมันใช้เพียงแค่ "ชื่อ" ของเมนูเพื่อแทรกเนื้อหาบางอย่าง

เพื่อแสดงให้เห็นถึงสิ่งนี้ฉันได้ติดตั้งสคริปต์โต้ตอบพื้นฐานที่ขอให้ผู้ใช้ป้อนข้อความ (รอ 6 วินาที) ซึ่งจะปรากฏในแถบเมนูชั่วคราว (5 วินาที)
นี่มันคือ:

use framework "Foundation"
use framework "AppKit"
use scripting additions
property StatusItem : missing value
property newMenu : class "NSMenu"

display dialog "Write something:" default answer "" giving up after 6
set myText to text returned of the result
if myText is "" then set myText to "TOOOOO slow … try again !"
set myText to ">>    " & myText & "    <<"

set bar to current application's NSStatusBar's systemStatusBar
set StatusItem to bar's statusItemWithLength:-1.0
StatusItem's setTitle:myText
set newMenu to current application's NSMenu's alloc()'s initWithTitle:"Custom"
StatusItem's setMenu:newMenu

delay 5
current application's NSStatusBar's systemStatusBar()'s ¬
        removeStatusItem:StatusItem  

รหัส AppleScript นี้สามารถใช้ในสคริปต์ใด ๆ ของคุณ (ส่วน "โต้ตอบ" เป็นตัวเลือก…)

user3439894 ช่วยด้วยการปิด "เมนู" ของฉันดูบรรทัดสุดท้ายของสคริปต์ ขอบคุณมาก!


คุณมีลิงค์ไปยังซอร์สโค้ดต้นฉบับที่คุณได้รับคำตอบจากคุณหรือไม่? มันคงจะดีที่ได้เห็น ขอบคุณ
user3439894

1
ใช่ - /programming/29168474/creating-a-simple-menubar-app-using-applescriptมันอยู่ในตัวจัดการสุดท้ายของคำตอบที่ได้รับการยอมรับสำหรับคำถามนี้: . . . . แม้ว่าผมกลัวว่าบรรทัดสุดท้ายของฉัน (ทำงานครึ่งหนึ่งของเวลา) ที่ฉันพบที่อื่นและอื่น adapted- คือไม่ถูกต้อง . . . . . ฉันไม่ใช่โปรแกรมเมอร์ดังนั้นฉันจึงต้องใช้เวลาในการเข้าใจโค้ดมากขึ้น
clemsam lang

1
BTW มันเป็นคำตอบที่ดีและถ้าไม่ใช่เพราะ "มันล้มเหลวสองสามครั้ง - เพราะ" dealloc () "?" ฉันจะได้ +1 อาหารบางอย่างที่คิดว่า ... หากคุณใช้รหัสนี้เป็นแอป AppleScriptObjC แบบสแตนด์อะโลนอาจเป็นสิ่งที่ดีกว่าดังนั้นจึงStatusItem's dealloc()สามารถใช้ได้กับแอป AppleScriptObjC เท่านั้นไม่ใช่ตัวแก้ไขสคริปต์
user3439894

FWIW set myText to ...บรรทัดแรกของโค้ดหนึ่งdisplay dialog คำสั่งก่อนหน้านี้ไม่ได้ทำอะไรเลยตามโค้ดที่ตามมาดังนั้นจึงไม่จำเป็นเลย ในคำอื่น ๆ ที่ใช้เฉพาะค่าของmyTextคือสิ่งที่ได้รับมอบหมายหลังจากที่display dialog คำสั่งจะถูกเรียกใช้และทำไมการตั้งค่าให้อะไรก่อนที่display dialog คำสั่งไม่ได้ใช้การเข้ารหัสและไม่จำเป็นต้องมีในบริบทของรหัสที่นำเสนอในขณะนี้
user3439894

1
แทนที่จะเป็นStatusItem's dealloc()หรือStatusItem's setTitle:""ฉันจะใช้:current application's NSStatusBar's systemStatusBar()'s removeStatusItem:StatusItem
user3439894
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.