【问题标题】:Get windows with same process name but different pid in AppleScript在AppleScript中获取具有相同进程名称但不同pid的窗口
【发布时间】:2018-01-09 17:37:31
【问题描述】:

我知道如何从同一个应用程序进程中获取 pid

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

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

我怎样才能得到以前得到的 pid 不同的窗口?

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

应用由 cmd open -n打开(同一应用的不同实例)

例如:

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

感谢您的帮助。

【问题讨论】:

标签: applescript


【解决方案1】:

我正在尝试了解您想要实现的目标,但由于缺乏明确的上下文以及了解这些代码 sn-ps 的来源以及它们的使用方式,这很困难。

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

在此基础上,您可以使用 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

这个列表中一个有用的属性是 index:它决定了窗口的从前到后的顺序,其中 index 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(它是一个整数)将有一个值告诉您创建窗口的顺序可能会有所帮助:最近创建的窗口将有一个 id 比之前存在的数值更大。

【讨论】:

  • 你得到我想要的,非常接近,我用“open -n myApplication.app”打开应用程序命令get every window 得到一个错误tell application "myApplication" get every window --> error number -1708Finder是只有一个应用程序有多个窗口,但不是适合我的情况
  • 抱歉,很难理解你想要什么。 open -n 运行同一应用程序的不同实例...我想我现在理解得更好了。您想获取属于您的应用程序每个实例的所有窗口吗?
  • 是的,这就是我想做的!我可以得到pid,但它似乎没用。感谢您的帮助!
  • 不,这很容易。我现在正在为你写一个答案。
【解决方案2】:

您必须使用 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

【讨论】:

  • 如果能够在这一行代码中为位置指定不同的值,那将是崇高的:tell application "System Events" to set position of windows of every process whose name is "MyApplication Window" to {0,0} 实际上,它只是将它们都设置为相同的位置。
  • 我通过 cmd line 'open -n application.app` 打开了多个相同的应用程序。出现错误tell application "System Events" get unix id of every process whose name contains "application" --> {4125, 4131, 4134, 4137} set position of window "application" of process 1 whose unix id = 4125 to {39, 578} --> error number -1728 from window "application" of process 1 whose unix id = 4125
  • 查看我的新答案,我希望现在可以解决您的问题。
【解决方案3】:

我正在添加第二个答案,因为我现在收集您希望实现的是获取对属于单个应用程序的单独、同时运行的实例的窗口的引用,这些窗口是使用 Terminalopen -n 打开的/em>

所以我只是继续做同样的事情。我从 Terminal 启动了第二个 Script Editor 实例,每个实例都有一个名为“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,如果您想定位其中一个窗口,它的好处是可以轻松引用单行。 idunix 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"

【讨论】:

  • 设置应用程序特定实例的窗口位置如下:set position of window "Untitled" of process id 42006541 to {39, 578}
  • 它有效,非常感谢!顺便说一句,我在哪里可以了解有关 AppleScript 的更多信息?:)
  • 我猜你遇到过developer documentation ?这就是我使用的。此外,还可以浏览 StackOverflowAskDifferent 上的 AppleScript 帖子。否则,最好的方法总是边做边学。设计一个项目,去做,当你遇到不知道如何实现的事情时用谷歌搜索。
猜你喜欢
  • 1970-01-01
  • 2019-09-09
  • 2012-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-12
  • 2015-04-05
  • 1970-01-01
相关资源
最近更新 更多