********** โซลูชันที่ปรับปรุงแล้ว **********
การอัปเดตนี้เป็นคำตอบโดยตรงสำหรับคำถามดั้งเดิมของ OP
รหัส AppleScript ต่อไปนี้จะเพิ่มรายการเมนูสถานะ "เล่น / หยุดชั่วคราว YouTube" พร้อมตัวเลือกในการเล่นหรือหยุดวิดีโอ YouTube ชั่วคราวใน Google Chrome หรือ Safari ไม่ว่าจะเห็นเบราว์เซอร์หรือไม่ก็ตาม บันทึกรหัส AppleScript ต่อไปนี้เป็นแอปพลิเคชัน "เปิดอยู่" ใน Script Editor.app
use framework "Foundation"
use framework "AppKit"
use scripting additions
property StatusItem : missing value
property selectedMenu : ""
property defaults : class "NSUserDefaults"
property internalMenuItem : class "NSMenuItem"
property externalMenuItem : class "NSMenuItem"
property newMenu : class "NSMenu"
my makeStatusBar()
my makeMenus()
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:"Play/Pause YouTube"
-- 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
on makeMenus()
newMenu's removeAllItems() -- remove existing menu items
set someListInstances to {"Play/Pause YouTube - Safari", "Play/Pause YouTube - Chrome", "Quit"}
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" & (i as text) & ":") keyEquivalent:"")
(newMenu's addItem:thisMenuItem)
(thisMenuItem's setTarget:me) -- required for enabling the menu item
end repeat
end makeMenus
on someAction1:sender
clickClassName2("ytp-play-button ytp-button", 0)
end someAction1:
on someAction2:sender
clickClassName("ytp-play-button ytp-button", 0)
end someAction2:
on someAction3:sender
quit me
end someAction3:
to clickClassName2(theClassName, elementnum)
if application "Safari" is running then
try
tell application "Safari"
tell window 1 to set current tab to tab 1 whose URL contains "youtube"
do JavaScript "document.getElementsByClassName('" & theClassName & "')[" & elementnum & "].click();" in document 1
end tell
end try
end if
end clickClassName2
to clickClassName(theClassName, elementnum)
tell application "Google Chrome" to (tabs of window 1 whose URL contains "youtube")
set youtubeTabs to item 1 of the result
tell application "Google Chrome"
execute youtubeTabs javascript "document.getElementsByClassName('" & theClassName & "')[" & elementnum & "].click();"
end tell
end clickClassName
หากคุณต้องการให้ ... Play Pause YouTube Status Menu.app ปรากฏเฉพาะในเมนูสถานะและไม่ได้อยู่ใน Dock คุณสามารถคลิกขวาที่แอพใน Finder และเลือกตัวเลือกเพื่อ "แสดงเนื้อหาแพ็คเกจ" ในโฟลเดอร์ Contents ให้เปิดไฟล์ Info.plist ในตัวแก้ไขข้อความและเพิ่มสองบรรทัดต่อไปนี้ จากนั้นบันทึกและปิดไฟล์นั้น
<key>LSBackgroundOnly</key>
<true/>
หากคุณไม่สะดวกในการแก้ไขไฟล์. plist โดยตรงรหัส AppleScript ต่อไปนี้จะอนุญาตให้คุณเลือกแอปพลิเคชันที่จะซ่อนจาก Dock เมื่อเรียกใช้
หากแอพพลิเคชั่นที่เลือกนั้นถูกตั้งค่าให้ซ่อนอยู่จาก Dock ตัวเลือกเดียวที่คุณจะได้รับคือการยกเลิกการซ่อนแอปพลิเคชันไม่ให้ปรากฏใน Dock ในขณะที่กำลังทำงาน ... และในทางกลับกัน
สคริปต์นี้มีประโยชน์อย่างยิ่งสำหรับการซ่อน "คงแอปพลิเคชันที่เปิดอยู่" ด้วยไอคอนแอปพลิเคชันของตัวจัดการที่ไม่ทำงานและไม่ปรากฏใน Dock ขณะที่ทำงาน
property fileTypes : {"com.apple.application-bundle"}
property plistFileItem : " <key>LSBackgroundOnly</key>" & linefeed & " <true/>"
activate
set chosenApp to (choose application with prompt ¬
"Choose The Application You Want Hidden From The Dock While It Is Running" as alias)
tell application "System Events" to set appName to name of chosenApp
set plistFile to ((POSIX path of chosenApp) & "/Contents/info.plist") as string
set plistFileContents to (read plistFile)
set plistFileItemExists to plistFileItem is in plistFileContents
if plistFileItemExists then
activate
set theChoice to button returned of (display dialog ¬
"Would you like to un-hide " & quote & appName & quote & ¬
" from the Dock while it's running?" buttons {"Cancel", "Un-Hide"} ¬
default button 2 cancel button 1 with title "Make A Choice")
else
activate
set theChoice to button returned of (display dialog ¬
"Would you like to hide " & quote & appName & quote & ¬
" from the Dock while it's running?" buttons {"Cancel", "Hide"} ¬
default button 2 cancel button 1 with title "Make A Choice")
end if
if theChoice is "Hide" then
tell application "System Events" to tell contents of property list file plistFile ¬
to make new property list item at end with properties ¬
{kind:string, name:"LSBackgroundOnly", value:true}
else if theChoice is "Un-Hide" then
tell application "System Events" to tell contents of property list file plistFile ¬
to make new property list item at end with properties ¬
{kind:string, name:"LSBackgroundOnly", value:false}
else
return
end if
************ วิธีแก้ปัญหาดั้งเดิม ************
สคริปต์นี้จะคลิกที่ปุ่มเล่น / หยุดชั่วคราวในวิดีโอที่เล่นใน YouTube ใน Google Chrome ไม่ว่า Google Chrome จะมองเห็นหรือไม่ก็ตาม
to clickClassName(theClassName, elementnum)
tell application "Google Chrome" to (tabs of window 1 whose URL contains "youtube")
set youtubeTabs to item 1 of the result
tell application "Google Chrome"
execute youtubeTabs javascript "document.getElementsByClassName('" & theClassName & "')[" & elementnum & "].click();"
end tell
end clickClassName
clickClassName("ytp-play-button ytp-button", 0)
นี่เป็นเวอร์ชั่นสคริปต์ที่จะทำงานกับ Safari
to clickClassName2(theClassName, elementnum)
tell application "Safari"
tell window 1 to set current tab to tab 1 whose URL contains "youtube"
do JavaScript "document.getElementsByClassName('" & theClassName & "')[" & elementnum & "].click();" in document 1
end tell
end clickClassName2
clickClassName2("ytp-play-button ytp-button", 0)
ในความพยายามที่จะให้โซลูชั่น Apple A ที่สมบูรณ์ด้วย OP ฉันได้รับคำตอบดั้งเดิมของฉันไปอีกขั้นหนึ่งแล้ว ..
UPDATE
ในที่สุดฉันก็พบมัน ฉันสร้างแอปพลิเคชัน AppleScript ใน Xcode เดิมโครงการของฉันเริ่มต้นด้วยหน้าต่างปุ่มเดียวเพื่อควบคุมวิดีโอ YouTube ที่ใช้งานอยู่ใน Chrome หรือ Safari ในปัจจุบัน โครงการนี้มีการเติบโตเล็กน้อยในแอปพลิเคชันที่มีสาธารณูปโภคหลายอย่าง GIF นี้แสดงปุ่ม YouTube Pause ที่ควบคุม YouTube ใน Chrome และ Safari ฉันเชื่อมโยงการทำงานของปุ่มกับ AppleScript ที่ฉันเขียนไว้ในเอดิเตอร์สคริปต์
นี่เป็นภาพรวมของแอปพลิเคชั่น Xcode ที่ทำงานในไฟล์ AppDelegate.applescript
นี่คือรหัสในไฟล์ที่ฉันสร้างขึ้นเพื่อให้โปรแกรมทำงานได้
script AppDelegate
property parent : class "NSObject"
-- IBOutlets
property theWindow : missing value
to clickClassName(theClassName, elementnum) -- Handler for pausing YouTube in Chrome
if application "Google Chrome" is running then
try
tell application "Google Chrome" to (tabs of window 1 whose URL contains "youtube")
set youtubeTabs to item 1 of the result
tell application "Google Chrome"
execute youtubeTabs javascript "document.getElementsByClassName('" & theClassName & "')[" & elementnum & "].click();"
end tell
end try
end if
end clickClassName
to clickClassName2(theClassName, elementnum) -- Handler for pausing YouTube in Safari
if application "Safari" is running then
try
tell application "Safari"
tell window 1 to set current tab to tab 1 whose URL contains "youtube"
do JavaScript "document.getElementsByClassName('" & theClassName & "')[" & elementnum & "].click();" in document 1
end tell
end try
end if
end clickClassName2
on doSomething:sender -- Calls the Chrome YouTube Handler
clickClassName("ytp-play-button ytp-button", 0)
end doSomething:
on doSomething14:sender -- Calls the Safari YouTube Handler
clickClassName2("ytp-play-button ytp-button", 0)
end doSomething14:
on doSomething2:sender -- Hide and or show the Menu Bar
tell application "System Preferences"
reveal pane id "com.apple.preference.general"
end tell
tell application "System Events" to tell process "System Preferences" to tell window "General"
click checkbox "Automatically hide and show the menu bar"
end tell
delay 1
quit application "System Preferences"
end doSomething2:
on doSomething3:sender -- Sets Display resolution to the second lowest setting (15 inch Built In Retina Display - MBP)
tell application "System Preferences"
reveal anchor "displaysDisplayTab" of pane "com.apple.preference.displays"
end tell
tell application "System Events" to tell process "System Preferences" to tell window "Built-in Retina Display"
click radio button "Scaled" of radio group 1 of tab group 1
click radio button 2 of radio group 1 of group 1 of tab group 1
end tell
quit application "System Preferences"
end doSomething3:
on doSomething4:sender -- Sets Display resolution to the second highest setting (15 inch Built In Retina Display - MBP)
tell application "System Preferences"
reveal anchor "displaysDisplayTab" of pane "com.apple.preference.displays"
end tell
tell application "System Events" to tell process "System Preferences" to tell window "Built-in Retina Display"
click radio button "Scaled" of radio group 1 of tab group 1
click radio button 4 of radio group 1 of group 1 of tab group 1
end tell
quit application "System Preferences"
end doSomething4:
on doSomething5:sender -- Sets Display resolution to the highest setting (15 inch Built In Retina Display - MBP)
tell application "System Preferences"
reveal anchor "displaysDisplayTab" of pane "com.apple.preference.displays"
end tell
tell application "System Events" to tell process "System Preferences" to tell window "Built-in Retina Display"
click radio button "Scaled" of radio group 1 of tab group 1
click radio button 5 of radio group 1 of group 1 of tab group 1
end tell
quit application "System Preferences"
end doSomething5:
on doSomething6:sender -- Sets Display resolution to the lowest setting (15 inch Built In Retina Display - MBP)
tell application "System Preferences"
reveal anchor "displaysDisplayTab" of pane "com.apple.preference.displays"
end tell
tell application "System Events" to tell process "System Preferences" to tell window "Built-in Retina Display"
click radio button "Scaled" of radio group 1 of tab group 1
click radio button 1 of radio group 1 of group 1 of tab group 1
delay 0.1
click button "OK" of sheet 1
quit application "System Preferences"
end tell
end doSomething6:
on doSomething7:sender -- Displays a dialog with your current IP
tell current application to display dialog (do shell script "curl ifconfig.io") with icon 2 buttons "OK" default button 1 with title "Your Current IP Address Is.." giving up after 5
end doSomething7:
on doSomething8:sender -- Shows hidden files in Finder
do shell script "defaults write com.apple.finder AppleShowAllFiles TRUE\nkillall Finder"
end doSomething8:
on doSomething9:sender -- Hides hidden files in Finder if they are showing
do shell script "defaults write com.apple.finder AppleShowAllFiles FALSE\nkillall Finder"
end doSomething9:
on doSomething10:sender -- Brightness Highest
tell application "System Preferences"
reveal anchor "displaysDisplayTab" of pane "com.apple.preference.displays"
end tell
tell application "System Events" to tell process "System Preferences" to tell window "Built-in Retina Display"
set value of value indicator 1 of slider 1 of group 2 of tab group 1 to 12
end tell
quit application "System Preferences"
end doSomething10:
on doSomething11:sender -- Brightness Lowest
tell application "System Preferences"
reveal anchor "displaysDisplayTab" of pane "com.apple.preference.displays"
end tell
tell application "System Events" to tell process "System Preferences" to tell window "Built-in Retina Display"
set value of value indicator 1 of slider 1 of group 2 of tab group 1 to 0.1
end tell
quit application "System Preferences"
end doSomething11:
on doSomething12:sender -- Zoom
tell application "System Events"
key code 28 using {command down, option down}
end tell
end doSomething12:
on doSomething13:sender -- Dictation On/Off
tell application "System Events"
keystroke "x" using {option down}
end tell
end doSomething13:
on doSomething15:sender -- Enables Screensaver as Desktop background
tell application "System Events"
do shell script "/System/Library/Frameworks/ScreenSaver.framework/Resources/ScreenSaverEngine.app/Contents/MacOS/ScreenSaverEngine -background"
end tell
end doSomething15:
on doSomething16:sender -- Kills Screensaver Desktop background
try
tell application id "com.apple.ScreenSaver.Engine" to quit
end try
end doSomething16:
on applicationWillFinishLaunching:aNotification
-- Insert code here to initialize your application before any files are opened
end applicationWillFinishLaunching:
on applicationShouldTerminate:sender
-- Insert code here to do any housekeeping before your application quits
return current application's NSTerminateNow
end applicationShouldTerminate:
on applicationShouldTerminateAfterLastWindowClosed:sender -- Quits app when clicking red x
return TRUE
end applicationShouldTerminateAfterLastWindowClosed:
end script
ฉันอัปเดตรหัสเพื่อให้แท็บ YouTube ใน Chrome ไม่จำเป็นต้องเป็นแท็บที่มองเห็นหรือใช้งานได้เมื่อคลิกปุ่มหยุดชั่วคราวของ YouTube ที่สร้างขึ้นใน Xcode
นี่คือลิงค์สำหรับดาวน์โหลดโครงการ Xcode ทั้งหมด
คำเตือน: ฟังก์ชั่นโปรแกรมรักษาหน้าจอเดสก์ท็อปจะหยุดการทำงานของแอพ หลังจากบังคับให้ออกและเปิดใหม่ฟังก์ชันสกรีนเซฟเวอร์เดสก์ท็อปเพื่อออกจากโปรแกรมรักษาหน้าจอที่ใช้งานจะทำงาน
คิดภายหลัง: ฉันอาจจะต้องห่อแต่ละรหัส AppleScript ในงบ "ลอง" เพื่อหลีกเลี่ยงข้อความแสดงข้อผิดพลาดทุกประเภทสำหรับผู้ที่เล่นกับโครงการนี้ที่ไม่มีระบบและคอมพิวเตอร์ชนิดเดียวกันที่ฉันทำ (MacBook Pro 15 "ระบบปฏิบัติการ Sierra 10.12.6)
สำหรับฟังก์ชั่นซูมในการทำงานจะต้องเปิดใช้งานในการตั้งค่าระบบ
เพื่อให้การสลับ "เปิด / ปิด Dictation" ทำงานอย่างถูกต้องทางลัดเพื่อเปิดใช้งานคำสั่งการเขียนตามคำบอกในการตั้งค่าระบบต้องตรงกับทางลัดที่ใช้ในสคริปต์
on doSomething13:sender -- Dictation On/Off
tell application "System Events"
keystroke "x" using {option down}
end tell
end doSomething13:
ขณะนี้ฉันกำลังทำงานกับความสามารถในการสลับระหว่างแอปพลิเคชันที่ทำงานอยู่ที่หน้าต่างหรือแถบเมนูเท่านั้น