在AppleScript中获取进程名称相同但pid不同的窗口

在AppleScript中获取进程名称相同但pid不同的窗口,applescript,Applescript,我知道如何从相同的应用程序中获取pid set pidList to the unix id of (every process whose name contains "MyApplication") pidList将获取具有相同进程名称“MyApplication”的所有进程id 如何使用以前的pid获得不同的窗口 T这些窗口都有相同的名称“MyApplication Window”,所以我不能简单地使用下面的内容 应用程序由cmd打开open-n(同一应用程序的单独实例) 例如: 谢谢您

我知道如何从相同的应用程序中获取pid

set pidList to the unix id of (every process whose name contains "MyApplication")
pidList将获取具有相同进程名称“MyApplication”的所有进程id

如何使用以前的pid获得不同的窗口

T这些窗口都有相同的名称“MyApplication Window”,所以我不能简单地使用下面的内容

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

例如:


谢谢您的帮助。

我正试图理解您想要实现的目标,但由于缺乏清晰的上下文,并且不知道这些代码片段是从何处获取的,以及它们是如何使用的,所以很难理解

但是,我的回答是基于我的假设,即您有两个(或更多)窗口具有相同的名称或标题,并且希望知道如何隔离其中一个窗口以设置其位置

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

首先,不要为此使用系统事件。使用
告诉应用程序“MyApplication”到…

例如,我有两个打开的查找窗口,都叫做“图片”。但当我运行这个:

    tell application "Finder" to get every window
    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"}
它返回以下内容:

    {Finder window id 10557 of application "Finder",
     Finder window id 10786 of application "Finder"}
按如下方式获取其中一个窗口的属性:

    tell application "Finder" to get properties of window id 10557
    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}
    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"}}
    tell application "System Events" to ¬
        get window "Untitled" of process id 42006541

    --> window "Untitled" of application process "Script Editor" of application "System Events"
此列表中的一个有用属性是索引:它确定窗口的前后顺序,其中索引1为前窗口,索引2为后窗口,依此类推

通过选择这些属性中的任意一个,并将其位置设置为如下所示,可以隔离所需的窗口:

    tell application "Finder" to get properties of window id 10557
    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}
    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"}}
    tell application "System Events" to ¬
        get window "Untitled" of process id 42006541

    --> window "Untitled" of application process "Script Editor" of application "System Events"
或者像这样:

    tell application "Finder" to get properties of window id 10557
    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}
    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"}}
    tell application "System Events" to ¬
        get window "Untitled" of process id 42006541

    --> window "Untitled" of application process "Script Editor" of application "System Events"
请记住,窗口的索引将根据在任何给定时间处于最前面的索引而变化。但是,id将保持唯一和不变,直到窗口关闭并重新打开,此时它将获得一个新的id


了解id(是一个整数)也可能有帮助将有一个值,告诉您创建窗口的顺序:最近创建的窗口的id将比之前存在的窗口具有更大的数值。

,但由于缺乏清晰的上下文,并且不知道这些代码片段是从何处获取的,以及它们是如何被使用的,这是很困难的

但是,我的回答是基于我的假设,即您有两个(或更多)窗口具有相同的名称或标题,并且希望知道如何隔离其中一个窗口以设置其位置

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

首先,不要为此使用系统事件。使用
告诉应用程序“MyApplication”到…

例如,我有两个打开的查找窗口,都叫做“图片”。但当我运行这个:

    tell application "Finder" to get every window
    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"}
它返回以下内容:

    {Finder window id 10557 of application "Finder",
     Finder window id 10786 of application "Finder"}
按如下方式获取其中一个窗口的属性:

    tell application "Finder" to get properties of window id 10557
    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}
    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"}}
    tell application "System Events" to ¬
        get window "Untitled" of process id 42006541

    --> window "Untitled" of application process "Script Editor" of application "System Events"
此列表中的一个有用属性是索引:它确定窗口的前后顺序,其中索引1为前窗口,索引2为后窗口,依此类推

通过选择这些属性中的任意一个,并将其位置设置为如下所示,可以隔离所需的窗口:

    tell application "Finder" to get properties of window id 10557
    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}
    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"}}
    tell application "System Events" to ¬
        get window "Untitled" of process id 42006541

    --> window "Untitled" of application process "Script Editor" of application "System Events"
或者像这样:

    tell application "Finder" to get properties of window id 10557
    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}
    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"}}
    tell application "System Events" to ¬
        get window "Untitled" of process id 42006541

    --> window "Untitled" of application process "Script Editor" of application "System Events"
请记住,窗口的索引将根据在任何给定时间处于最前面的索引而变化。但是,id将保持唯一和不变,直到窗口关闭并重新打开,此时它将获得一个新的id


知道id(是一个整数)将有一个值告诉您创建窗口的顺序也可能会有帮助:最近创建的窗口将有一个id,其数值大于之前存在的值。

必须使用
告诉(unix id为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

必须使用
tell(unix id为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

我正在添加第二个答案,因为我现在收集到您希望实现的是获取对属于单个应用程序的独立、并发运行实例的窗口的引用,这些应用程序是使用终端中的
open-n
打开的

所以我继续做同样的事情。我从终端启动了脚本编辑器的第二个实例,每个实例都有一个名为“Untitled”的窗口。我在其中一个实例中打开了另一个文档(因此一个实例有两个窗口,另一个只有一个)。我检索了两个实例的窗口,如下所示:

    tell application "Finder" to get properties of window id 10557
    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}
    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"}}
    tell application "System Events" to ¬
        get window "Untitled" of process id 42006541

    --> window "Untitled" of application process "Script Editor" of application "System Events"
它返回一个列表,但在该列表中嵌套了两个独立的列表,一个用于脚本编辑器的每个实例,在这些列表中是属于每个实例的窗口。正如您所期望的,一个列表有一个项(因为在应用程序的实例中只有一个窗口,称为“无标题”),而另一个列表有两个项目(用于其两个窗口,其中一个窗口也称为“无标题”)

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

    tell application "Finder" to get every window
    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}}
你可以