AppleScript的。获取所有实例的属性

时间:2018-01-29 18:12:22

标签: applescript vlc

我有许多VLC实例打开。我想检查每个实例的播放状态,如:

tell application "VLC"
    if playing = true then return
end tell

但它只检查一个VLC实例。我该如何检查所有实例?

4 个答案:

答案 0 :(得分:0)

根据您的评论,这是一个解决方法的答案"我想阻止在VLC实例播放时执行计划的Apple脚本。"以及在此之前发布的其他评论和答案中提供的其他信息。此外,通过执行,我假设您的意思是在按计划开始的脚本中执行任何其他代码。

另请注意,这可能并不完美,但是要提供它试试。

在我的系统上,当VLC的打开并且没有加载内容时,在CPU使用率的初始百分比达到峰值之后,它很快就会稳定到0%并且内容已加载但未播放的内容小于5%且通常低于3%。如果它正在播放,通常总是大于5%。

这当然可能会因您的系统而异,因此您需要在一段时间内监控CPU使用情况,以了解它在您的系统上如何波动以查看最佳位置。

下面的示例AppleScript代码放置在计划的AppleScript中的代码的开头,在脚本中的代码之前触发VLC的任何内容,如果其他实例的CPU使用百分比,将中止处理其余的脚本VLC的含量等于或大于5%。

set |VLC%CPU| to paragraphs of text of ¬
    (do shell script "ps -Ac -o %cpu -o command | grep [V]LC ; exit 0")
repeat with thisItem in |VLC%CPU|
    if first word of thisItem as integer ≥ 5 then return
end repeat

答案 1 :(得分:0)

另一种方法可以是通过制作应用程序的副本来重命名实例,并为它们提供新名称,例如VLC1,VLC2。您可以通过转到应用程序文件夹并复制VLC应用程序来完成此操作。然后将其粘贴到同一文件夹中以创建应用程序“VLC副本”。然后重命名您创建的每个副本。副本现在将显示在applescript词典中。

现在,您可以为每个实例使用tell块来检查它是否正在播放。您只需要确保为您播放的号码打开正确的实例号码。例如。如果您只有2个实例,或者关闭较低的实例编号,请不要打开“VLC1”和“VLC3”。通过使用if c is equal to语句,它不会通过执行tell块来打开该应用程序的实例。

如果您打开了所有实例,则可以删除循环和if语句,并检查它们是否正在播放。

on getCount()
    tell application "System Events"
        set p to processes whose name contains "VLC"
        set theCount to count of p
        return theCount
    end tell
end getCount

set appCount to my getCount()
if appCount is greater than 0 then
    repeat with c from 1 to appCount
        if c is equal to 1 then
            tell application "VLC1"
                if playing is true then
                    log ("playing 1")
                end if
            end tell
        end if
        if c is equal to 2 then
            tell application "VLC2"
                if playing is true then
                    log ("playing 2")
                end if
            end tell
        end if
    end repeat
end if

答案 2 :(得分:0)

到目前为止,我所做的一半解决方案是:

tell application "System Events"
    if (name of application processes whose frontmost is true) = {"VLC"} then return
end tell

所以我检查它是最前面的。通常,如果我经营一部电影,它就是最前面的。我更喜欢“正在播放”的变化,但是......好吧,我能做些什么。

答案 3 :(得分:0)

我想我现在更了解你的查询的本质。我以前对你的目标有点困惑,但现在我正在收集它只是为了确定是否正在播放任何 VLC 实例。这是对的吗?

但你做需要知道正在播放什么或者正在播放哪个窗口?

我是否正确地说你只需要发现许多人中的一个实例正在播放,在这种情况下,这足以阻止其他一些AppleScript执行?或者换句话说,当且仅当没有 VLC 的实例正在播放时,其他AppleScript才会执行?

我相信这是可以实现的。虽然我们无法使用 VLC 应用程序对象的playing属性,但我们可以使用 VLC 进程/窗口的属性/属性来确定是否每个正在播放 VLC 的实例。

    tell application "System Events"
        set _W to a reference to window 1 of (every process whose name is "VLC")
        set _title to the value of attribute "AXTitle" of _W
    end tell

这就是你所需要的,因为AXTitle属性根据 VLC 的状态返回非常可预测的数据:

如果VLC正在播放而不是全屏: _title评估为非空字符串(具体而言,它包含视频文件的名称或互联网流的路径)

如果VLC未播放: _title评估为“VLC媒体播放器”。

如果VLC正在播放且IS全屏: _title评估为空字符串(“”)。

因此:

  

如果_title =“VLC媒体播放器”,则 VLC 播放;否则, VLC 正在播放。

利用这一事实,为了允许您的其他AppleScript执行,我们希望每个 VLC 的每个 _title值代表相等到“VLC媒体播放器”。如果_title中除了那个值之外还有一个值,则断言失败并且脚本可以终止,或者做任何它需要做的事情来阻止执行其他脚本。

我选择简单地计算使用名称“AXTitle”返回的属性数和“VLC媒体播放器”以外的值。返回的数字等于当前正在播放的 VLC 实例的数量:

    tell application "System Events" to count ¬
    (the attributes of window 1 of ¬
        (every process whose name is "VLC") whose ¬
        name is "AXTitle" and ¬
        value is not "VLC media player")

    if result is not 0 then return