在AppleScript

时间:2018-01-02 09:25:22

标签: applescript

我知道如何从同一申请流程中获取pid

set pidList to the unix id of (every process whose name contains "MyApplication")

pidList将获取具有相同进程名称“MyApplication”

的所有进程ID
  

如何获得之前获得的pid的不同窗口?

T 他的Windows名称相同“MyApplication Window”,所以我不能简单地在下面使用。

应用程序由cmd open -n打开(同一应用程序的单独实例)

例如:

set position of window "MyApplication Window" of (application process whose unix id is theItem) to {39, 578}

感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

我试图了解您尝试实现的目标,但由于缺乏明确的背景信息并且知道这些代码段的来源以及它们如何被使用,因此很难实现。

但是,我假设您有两个(或更多)具有相同名称或标题的窗口,并希望知道如何隔离一个这些窗口,以确定其位置。

在此基础上,您可以使用AppleScript不仅通过标题(名称)引用窗口,还可以使用名为窗口 id 的属性来引用窗口。

首先,不要使用系统事件。使用tell application "MyApplication" to...

将您的命令直接发送到相关应用程序

因此,例如,我有两个打开的 Finder 窗口,它们都被称为"图片"。但是当我运行时:

    tell application "Finder" to get every window

它返回:

    {Finder window id 10557 of application "Finder",
     Finder window id 10786 of application "Finder"}

获取其中一个窗口的属性,如下所示:

    tell application "Finder" to get properties of window id 10557

此列表中有用的属性是索引:这决定了窗口的前后顺序,索引 1是前窗, index 2是它背后的一个,依此类推。

您可以通过选择任何这些属性来隔离所需的窗口,并将其位置设置为:

    tell application "Finder" to set position of window id 10557 to {39, 578}

或者像这样:

    tell application "Finder" to set position of window index 1 to {39, 578}

请记住,窗口的索引会根据在任何给定时间位于前面的位置而改变。但是, ID 将保持唯一且相同,直到窗口关闭并重新打开,此时会发出新的 ID

知道 id (这是一个整数)会有一个告诉你窗口创建顺序的值也可能会有所帮助:最近创建的窗口会有一个< strong> id 的数值大于之前存在的数值。

答案 1 :(得分:1)

您必须使用tell (first process whose unix id is someID)阻止。

以下是一个例子:

set thePosition to {39, 578}
tell application "System Events"
    set pidList to the unix id of (processes whose name contains "MyApplication")

    repeat with someID in pidList -- loop 
        tell (first process whose unix id is someID)
            set position of window "MyApplication Window" to thePosition
        end tell
        set item 1 of thePosition to (item 1 of thePosition) + 200 -- add 200 to the left (for the next window)
    end repeat
end tell

答案 2 :(得分:0)

我正在添加第二个答案,因为我现在收集的内容是获取对属于单个应用程序的单独并发运行实例的窗口的引用,使用来自open -n打开终端

所以我继续前进并做了同样的事情。我从 Terminal 启动了脚本编辑器的第二个实例,每个实例都有一个名为“Untitled”的窗口。我在其中一个实例中打开了另一个文档(所以一个实例有两个窗口,另一个实例只有一个)。我已经检索了这两个实例的窗口:

    tell application "System Events" to get every window of ¬
        (every process whose name is "Script Editor")

        --> {{window "Untitled" of application process "Script Editor" of application "System Events", ¬
              window "Import To Photos" of application process "Script Editor" of application "System Events"}, ¬
             {window "Untitled" of application process "Script Editor" of application "System Events"}}

它返回一个列表,但是在此列表中嵌套了两个单独的列表 - 每个脚本编辑器的实例一个 - 并且这些列表中的每个都是属于每个列表的窗口实例。正如您所期望的,一个列表有一个项目(因为在应用程序的实例上只有一个窗口,称为“无标题”),另一个列表有两个项目(对于它的两个窗口,其中一个也称为“无标题“)。

但如果我只对名为“Untitled”的窗口感兴趣,那么我可以运行它:

    tell application "System Events" to get window "Untitled" of ¬
        (every process whose name is "Script Editor")

        --> {window "Untitled" of application process "Script Editor" of application "System Events", ¬
             window "Untitled" of application process "Script Editor" of application "System Events"}

这次只有一个列表,我的两个看似相同的窗口。

通过使用应用程序流程的 unix id ,您可以在原始问题中暗示区分它们:

    tell application "System Events" to get [window "Untitled", unix id] of ¬
        (every process whose name is "Script Editor")


        --> {{window "Untitled" of application process "Script Editor" of application "System Events", ¬
              window "Untitled" of application process "Script Editor" of application "System Events"}, ¬
             {73822, 73913}}

您还可以使用流程的 id 属性而不是 unix id ,如果您想要定位其中一个窗口,则可以轻松引用单行。 id unix id 是不同的属性,并且是唯一的:

    tell application "System Events" to get [id, unix id] of ¬
        (processes whose name is "Script Editor")

        --> {{42006541, 42100772}, {73822, 73913}}

所以我可以像这样定位特定实例的特定窗口:

    tell application "System Events" to ¬
        get window "Untitled" of process id 42006541

    --> window "Untitled" of application process "Script Editor" of application "System Events"