如何让 Apple Script 仅在特定的显示器/显示器中单击?

Posted

技术标签:

【中文标题】如何让 Apple Script 仅在特定的显示器/显示器中单击?【英文标题】:How to get an Apple Script to click only within a specific display/monitor? 【发布时间】:2021-11-07 22:12:30 【问题描述】:

我正在尝试编写一个 Apple 脚本,以在我的第二台显示器上对应用程序执行一系列点击,但我只能让这些点击在我的主显示器上工作。有人可以指导我如何实现这种行为吗?

【问题讨论】:

在使用 Applescript 时几乎不需要编写 UI 脚本。指定您正在使用的应用程序以及您想要做什么,我们或许可以为您提供帮助。 @gurkensa 确定。在我的 第三个显示器 的窗口中的所有 Logic Pro X 中,我需要一个脚本来: 1. 单击浏览器左下角的“齿轮图标”。 2. 选择“启用补丁合并”。 3.禁用-点击“发送” 4.禁用-点击“音频效果” 我 99% 确信 Logic Pro X 没有脚本字典,但我认为您应该将其添加到您的问题中以阐明您的目标。信息越多越好。 @gurkensaas 当然,尽管我真的只是想问如何让 Apple 脚本点击第二个显示器——不管它点击的是什么信息或应用程序,因为我可能会将它用于其他事情将来。真的有那么复杂吗? 一般而言,就基本 vanilla AppleScript 而言,click commandSystem 的一部分事件,“click v : 导致目标进程的行为就像 UI 元素被点击一样”,并且可以click 特定的UI 元素 或“ [at 数字列表]:当发送到“进程”对象时,在全局坐标中单击的 x, y 位置。例如,我左边的 displaysecondary,而我右边的是 primary。续... 【参考方案1】:

参考您的评论...

在我的第三个显示器窗口中的所有 Logic Pro X 中,我需要一个脚本来: 1. 单击浏览器左下方的“齿轮图标”。 2. 选择“启用补丁合并”。 3.禁用-点击“发送” 4.禁用-点击“音频效果”

示例 AppleScript 代码(如下所示)是使用Logic Pro 在Script Editor 中测试的10.6.3ma​​cOS Catalina 下,System Preferences 中的 Language & Region 设置设置为 English (US) - Primary 并且为我工作没有问题1

1 假设 系统偏好设置 > 安全和隐私 > 隐私中的必要和适当的设置已设置/根据需要解决。

另请注意,示例 AppleScript 代码 假设 Merge following when loading Patch: 未显示并且 SendsAudio Effects启用

也只打开了一个Logic Pro 窗口

example AppleScript code 的第一个 block 中,我在前两个之间经历了约 5 秒的延迟perform action "AXPress" of ¬ events 并包含第二个 block example AppleScript code解决这个已知的约 5 秒延迟问题,在某些情况下会发生,以防您也遇到它。

示例 AppleScript 代码

tell application "System Events"
    tell application process "Logic Pro X"
        perform action "AXPress" of ¬
            pop up button 1 of ¬
            group 1 of group 2 of window 1
        perform action "AXPress" of ¬
            menu item "Enable Patch Merging" of ¬
            menu 1 of pop up button 1 of ¬
            group 1 of group 2 of window 1
        perform action "AXPress" of ¬
            checkbox "Sends" of ¬
            group 1 of group 1 of group 2 of window 1
        perform action "AXPress" of ¬
            checkbox "Audio Effects" of ¬
            group 1 of group 1 of group 2 of window 1
    end tell
end tell

如果您遇到约 5 秒的延迟,请尝试以下操作...

示例 AppleScript 代码

ignoring application responses
    tell application "System Events" to ¬
        perform action "AXPress" of ¬
            pop up button 1 of group 1 of group 2 of ¬
            window 1 of application process "Logic Pro X"
end ignoring

delay 0.1
do shell script "killall 'System Events'"
delay 0.2

tell application "System Events"
    run
    delay 0.2
    tell application process "Logic Pro X"
        perform action "AXPress" of ¬
            menu item "Enable Patch Merging" of ¬
            menu 1 of pop up button 1 of ¬
            group 1 of group 2 of window 1
        perform action "AXPress" of ¬
            checkbox "Sends" of ¬
            group 1 of group 1 of group 2 of window 1
        perform action "AXPress" of ¬
            checkbox "Audio Effects" of ¬
            group 1 of group 1 of group 2 of window 1
    end tell
end tell

注意事项:

虽然此处显示的 示例 AppleScript 代码 在指定条件下对我有用,但可能需要根据您的条件进行调整, ma​​cOS 的版本,可能需要添加一些错误处理,或者在一些事件之间使用delay 命令

这是一个最低限度的示例,应该添加额外的代码来检查各种UI 元素 的状态,以便能够毫无问题地出现想要的结果。例如,在执行动作之前检查SendsAudio Effects是否启用

示例 AppleScript 代码 使用 UI 脚本 并且可以是 kludgy 和由于多种不同的原因容易出错。


更新了错误处理示例

这是一个示例,它基于上面代码的第二个,用额外的错误处理进行编码,因为它会检查 是否正在显示,如果没有在继续之前显示它,以及其他包含的错误处理。以下 example AppleScript code 也被标记化,因此设置 propertiesvalue在第一组中,允许使用 美国英语 以外的语言,方法是酌情调整它们的 ,允许剩下的 代码 在这些属性

示例 AppleScript 代码

--  # User adjustable properties, the names 
--  # as they appear on the UI elements.

property |Enable Patch Merging| : "Enable Patch Merging"
property |Sends| : "Sends"
property |Audio Effects| : "Audio Effects"
property menuName : "View"
property menuCommand : "Show Library"
property windowName : "Untitled - Tracks"


--  ##############################################
--  # Do not modify code below unless necessary. #
--  ##############################################

property |Logic Pro| : name of application id "com.apple.logic10"
property |System Events| : name of application id "com.apple.systemevents"
property appName : missing value
property restoreFrontmost : false

tell application id "com.apple.systemevents"
    set appName to name of first process whose frontmost is true and background only is false
    tell application process |Logic Pro|
        if not (exists pop up button 1 of group 1 of group 2 of window windowName) then
            set restoreFrontmost to true
            perform action "AXRaise" of window windowName
            set frontmost to true
            perform action "AXPress" of menu bar item menuName of menu bar 1
            delay 0.2
            perform action "AXPress" of menu item menuCommand of menu menuName of menu bar item menuName of menu bar 1
        end if
        repeat until exists pop up button 1 of group 1 of group 2 of window windowName
            delay 0.01
        end repeat
        if not (exists checkbox |Sends| of group 1 of group 1 of group 2 of window windowName) then
            ignoring application responses
                perform action "AXPress" of pop up button 1 of group 1 of group 2 of window windowName
            end ignoring
        end if
    end tell
end tell

delay 0.1
do shell script "killall " & quoted form of |System Events|
delay 0.2

tell application id "com.apple.systemevents"
    run
    delay 0.2
    tell application process |Logic Pro|
        if not (exists checkbox |Sends| of group 1 of group 1 of group 2 of window windowName) then
            perform action "AXPress" of menu item "Enable Patch Merging" of menu 1 of pop up button 1 of group 1 of group 2 of window windowName
            delay 0.2
        end if
        if the value of checkbox |Sends| of group 1 of group 1 of group 2 of window windowName as boolean is true then
            perform action "AXPress" of checkbox |Sends| of group 1 of group 1 of group 2 of window windowName
        end if
        if the value of checkbox |Audio Effects| of group 1 of group 1 of group 2 of window windowName as boolean is true then
            perform action "AXPress" of checkbox |Audio Effects| of group 1 of group 1 of group 2 of window windowName
        end if
    end tell
end tell

if restoreFrontmost is true then tell application appName to activate

注意事项:

测试是在 secondary Display 上使用 Logic Pro X 完成的,而 脚本 是从 em>主要 显示

如果 Logic Pro X 中的 Library 没有显示,则必须将焦点转移到 Logic Pro X,但它会恢复到原来的状态焦点转移前最前面的应用程序。这种转变非常短暂,在我的测试中没有引起任何问题。如果 Library 已经显示焦点停留在执行 脚本 时的位置。


注意:示例 AppleScript 代码 就是这样,并且没有任何包含的错误处理不包含任何适当的额外错误处理。用户有责任根据需要或需要添加任何错误处理。查看AppleScript Language Guide 中的try statementerror statement。另请参阅Working with Errors。此外,在适当的情况下,可能需要在事件之间使用delay 命令,例如delay 0.5延迟设置得当。

【讨论】:

天哪,我可以付钱给你吗???这正是我一直在寻找的,而且效果很好!您对全部输入并演示其工作原理非常有帮助。说真的,你是知识的财富。我想知道,如果您有额外的时间 - 在单独的脚本中是否有办法能够选择/启用库中的“搜索”栏?我会尝试自己弄清楚,但我仍然掌握如何浏览您编写的精美脚本(即“组”的含义等)

以上是关于如何让 Apple Script 仅在特定的显示器/显示器中单击?的主要内容,如果未能解决你的问题,请参考以下文章

如何仅在中国启动我的 iOS iPhone 应用程序?

让 UITouch 仅在触摸特定颜色时执行任务

Wordpress:如何仅在特定页面上显示链接

如何仅在 CGRect 中使用 Apple Vision 检测条形码?

如何仅在特定页面上显示 route.v6 上的导航栏?

如何仅在 iphone 中显示特定的推送通知?