如何通过 Apple Script 在后台激活全屏应用程序
How to activate full screen apps in background via Apple Script
我一直在 Automator 中开发一个应用程序,它可以将桌面背景更改为 iTunes 中当前播放歌曲的专辑封面。
你可以下载我的第一个版本here。
我发现的最烦人的问题是,当在正在更新的同一显示器上打开一个全屏应用程序时,每当歌曲改变时,背景就会在当前歌曲和上一首歌曲之间闪烁。
这是我当前的代码(从上面的 1.0 版本更新而来):
您可能需要在代码中滚动才能看到所有内容。
tell application "System Events"
set fileName to (((path to desktop) as text) & ".iTunesArt2-1.jpg")
set oldFile to open for access file fileName with write permission
write 0 to oldFile
close access oldFile
delete file fileName
if process "iTunes" exists then
tell application "iTunes"
if (player state is not stopped) then
-- get the raw bytes of the artwork into a var
tell application "iTunes" to tell artwork 1 of current track
set srcBytes to raw data
end tell
-- write to file
set outFile to open for access file fileName with write permission
-- truncate the file
set eof outFile to 0
-- write the image bytes to the file
write srcBytes to outFile
close access outFile
end if
end tell
tell desktop 2
set picture to fileName
end tell
end if
set fileName to (((path to desktop) as text) & ".iTunesArt2-2.jpg")
set oldFile to open for access file fileName with write permission
write 0 to oldFile
close access oldFile
delete file fileName
if process "iTunes" exists then
tell application "iTunes"
if (player state is not stopped) then
-- get the raw bytes of the artwork into a var
tell application "iTunes" to tell artwork 1 of current track
set srcBytes to raw data
end tell
-- write to file
set outFile to open for access file fileName with write permission
-- truncate the file
set eof outFile to 0
-- write the image bytes to the file
write srcBytes to outFile
close access outFile
end if
end tell
tell desktop 2
set picture to fileName
end tell
end if
end tell
我从 here.
获得了将艺术品保存到文件的实际代码
桌面不会更新,除非你给它一个新的文件名来更新,因此我用 "iTunesArt2-1" 和 "iTunesArt2-1".
重复了这个过程
“2-1”或“2-2”中的前 2 个简单地表示第二个桌面,因为我有两个不同的应用程序来更改每个桌面,并使用我的第二个桌面进行测试。
整个应用程序设置为循环 1000 年,使用 Automator 中的三个独立循环功能(720 分钟、730 次和 1000 次)。
第一次尝试调试此问题时,该过程被复制到四个单独的脚本中,一个用于保存图像,然后设置为背景,另外两个脚本使用新文件名重复该过程。
这是我调试的一个例子:
- 我从“.iTunesArt##.jpg”中删除了开头句点,以便可以在桌面上看到这些文件。
- 我播放了一首 Coldplay 歌曲,运行 Automator 中的应用程序用于设置背景。
- "iTunesArt2-1.jpg" 和 "iTunesArt2-2.jpg" 在我的桌面上显示正确的专辑封面。
- 我停止应用程序,并播放一首 Paramore 歌曲。
- 我运行应用程序的第一个脚本(保存专辑封面)。
- "iTunesArt2-1.jpg"更新为帕拉摩尔原图。
- I 运行 应用程序的第二个脚本(设置背景图片)。
请注意,此脚本应将背景设置为 Paramore 图像。
- 背景仍然设置为 Coldplay 图像。
起初我认为这只是因为背景图像已经设置为"iTunesArt2-1.jpg",因此系统不会尝试再次更新它,不知道文件中的数据已被更改。
所以我运行下一个应该强制后台更新的脚本:
- 我运行应用程序中的第三个脚本。
- "iTunesArt2-2.jpg"更新为帕拉摩尔原图
- 我运行应用程序中的第四个脚本。
- 桌面背景更新为 Paramore 插图。
因此,我们可以确认脚本 3 和 4 工作正常。
根据代码,当应用程序循环回到脚本 1 和 2 时,桌面背景应保持为 Paramore 插图。
但是...
- 我运行应用程序中的第一个脚本。
- "iTunesArt2-1.jpg" 仍然是 Paramore 的艺术作品(应该如此)。
- 我运行应用程序中的第二个脚本。
此脚本应将桌面背景从“"iTunesArt2-2.jpg" (Paramore) 更新为 "iTunesArt2-1.jpg" (Paramore)。
- 桌面背景更改为酷玩乐队的插图。
现在这完全没有意义。
每次循环脚本时都会发生这种情况。
脚本 4 会将桌面更改为 Paramore,脚本 2 会将其更改回酷玩乐队。
请记住,只有在更新的同一显示器上打开全屏应用程序时才会出现此问题。 IE。在我的主显示器上打开全屏应用程序并不重要。
我发现有时滑动到全屏应用程序 'activating' 它会停止闪烁,并且背景会正确设置。
肯定没有什么'wrong'我的代码在那里?如果没有,我需要一种方法来解决这个问题。
具体来说,有没有一种方法 'activating' 每个全屏应用程序都在后台运行而无需移动到那些空间?
我会喜欢任何想要它的人拥有这个程序,但它需要能够 运行 在任何情况下。
如有任何帮助,我们将不胜感激。
找到了一个每次创建随机文件名的解决方法,这意味着桌面不会混淆它应该显示的图像。
screenNum
指的是桌面设置到哪个屏幕。
set randID to screenNum
set randLoop to 0
repeat while randLoop is not 9
set randNum to (random number from 0 to 9) as text
set randID to randID & randNum
set randLoop to randLoop + 1
end repeat
然后在创建文件名时包含 randID
。
使用此方法未发现任何闪烁。
注意:这解决了我的问题,但没有回答我最初的问题,即如何在后台激活全屏应用程序。
我一直在 Automator 中开发一个应用程序,它可以将桌面背景更改为 iTunes 中当前播放歌曲的专辑封面。
你可以下载我的第一个版本here。
我发现的最烦人的问题是,当在正在更新的同一显示器上打开一个全屏应用程序时,每当歌曲改变时,背景就会在当前歌曲和上一首歌曲之间闪烁。
这是我当前的代码(从上面的 1.0 版本更新而来):
您可能需要在代码中滚动才能看到所有内容。
tell application "System Events"
set fileName to (((path to desktop) as text) & ".iTunesArt2-1.jpg")
set oldFile to open for access file fileName with write permission
write 0 to oldFile
close access oldFile
delete file fileName
if process "iTunes" exists then
tell application "iTunes"
if (player state is not stopped) then
-- get the raw bytes of the artwork into a var
tell application "iTunes" to tell artwork 1 of current track
set srcBytes to raw data
end tell
-- write to file
set outFile to open for access file fileName with write permission
-- truncate the file
set eof outFile to 0
-- write the image bytes to the file
write srcBytes to outFile
close access outFile
end if
end tell
tell desktop 2
set picture to fileName
end tell
end if
set fileName to (((path to desktop) as text) & ".iTunesArt2-2.jpg")
set oldFile to open for access file fileName with write permission
write 0 to oldFile
close access oldFile
delete file fileName
if process "iTunes" exists then
tell application "iTunes"
if (player state is not stopped) then
-- get the raw bytes of the artwork into a var
tell application "iTunes" to tell artwork 1 of current track
set srcBytes to raw data
end tell
-- write to file
set outFile to open for access file fileName with write permission
-- truncate the file
set eof outFile to 0
-- write the image bytes to the file
write srcBytes to outFile
close access outFile
end if
end tell
tell desktop 2
set picture to fileName
end tell
end if
end tell
我从 here.
获得了将艺术品保存到文件的实际代码桌面不会更新,除非你给它一个新的文件名来更新,因此我用 "iTunesArt2-1" 和 "iTunesArt2-1".
重复了这个过程“2-1”或“2-2”中的前 2 个简单地表示第二个桌面,因为我有两个不同的应用程序来更改每个桌面,并使用我的第二个桌面进行测试。
整个应用程序设置为循环 1000 年,使用 Automator 中的三个独立循环功能(720 分钟、730 次和 1000 次)。
第一次尝试调试此问题时,该过程被复制到四个单独的脚本中,一个用于保存图像,然后设置为背景,另外两个脚本使用新文件名重复该过程。
这是我调试的一个例子:
- 我从“.iTunesArt##.jpg”中删除了开头句点,以便可以在桌面上看到这些文件。
- 我播放了一首 Coldplay 歌曲,运行 Automator 中的应用程序用于设置背景。
- "iTunesArt2-1.jpg" 和 "iTunesArt2-2.jpg" 在我的桌面上显示正确的专辑封面。
- 我停止应用程序,并播放一首 Paramore 歌曲。
- 我运行应用程序的第一个脚本(保存专辑封面)。
- "iTunesArt2-1.jpg"更新为帕拉摩尔原图。
- I 运行 应用程序的第二个脚本(设置背景图片)。
请注意,此脚本应将背景设置为 Paramore 图像。 - 背景仍然设置为 Coldplay 图像。
起初我认为这只是因为背景图像已经设置为"iTunesArt2-1.jpg",因此系统不会尝试再次更新它,不知道文件中的数据已被更改。
所以我运行下一个应该强制后台更新的脚本:
- 我运行应用程序中的第三个脚本。
- "iTunesArt2-2.jpg"更新为帕拉摩尔原图
- 我运行应用程序中的第四个脚本。
- 桌面背景更新为 Paramore 插图。
因此,我们可以确认脚本 3 和 4 工作正常。
根据代码,当应用程序循环回到脚本 1 和 2 时,桌面背景应保持为 Paramore 插图。
但是...
- 我运行应用程序中的第一个脚本。
- "iTunesArt2-1.jpg" 仍然是 Paramore 的艺术作品(应该如此)。
- 我运行应用程序中的第二个脚本。
此脚本应将桌面背景从“"iTunesArt2-2.jpg" (Paramore) 更新为 "iTunesArt2-1.jpg" (Paramore)。 - 桌面背景更改为酷玩乐队的插图。
现在这完全没有意义。
每次循环脚本时都会发生这种情况。
脚本 4 会将桌面更改为 Paramore,脚本 2 会将其更改回酷玩乐队。
请记住,只有在更新的同一显示器上打开全屏应用程序时才会出现此问题。 IE。在我的主显示器上打开全屏应用程序并不重要。
我发现有时滑动到全屏应用程序 'activating' 它会停止闪烁,并且背景会正确设置。
肯定没有什么'wrong'我的代码在那里?如果没有,我需要一种方法来解决这个问题。
具体来说,有没有一种方法 'activating' 每个全屏应用程序都在后台运行而无需移动到那些空间?
我会喜欢任何想要它的人拥有这个程序,但它需要能够 运行 在任何情况下。
如有任何帮助,我们将不胜感激。
找到了一个每次创建随机文件名的解决方法,这意味着桌面不会混淆它应该显示的图像。
screenNum
指的是桌面设置到哪个屏幕。
set randID to screenNum
set randLoop to 0
repeat while randLoop is not 9
set randNum to (random number from 0 to 9) as text
set randID to randID & randNum
set randLoop to randLoop + 1
end repeat
然后在创建文件名时包含 randID
。
使用此方法未发现任何闪烁。
注意:这解决了我的问题,但没有回答我最初的问题,即如何在后台激活全屏应用程序。