【问题标题】:Cocoa and AppleScript / Apple EventsCocoa 和 AppleScript / Apple 事件
【发布时间】:2012-10-21 22:24:54
【问题描述】:

我正在使用 Cocoa 的 [[NSWorkspace sharedWorkspace] launchApplicationAtURL…NSWorkspaceLaunchNewInstance 选项来生成 AppleScriptable 应用程序 (Adobe Acrobat) 的新实例,并且我希望能够触发不同的 Apple 事件(执行脚本、退出、保存等... ) 对于每个实例。

到目前为止,我已经尝试基于新进程的 ID 编写 AppleScript 的“系统事件”和tell 命令,但由于某种原因,这些命令没有被目标进程执行。

我得到了[NSRunningApplication processIdentifier] 的进程ID,并用它来编译[[[NSAppleScript alloc] initWithSource: AppleScript] executeAndReturnError: nil] 的applescript。 AppleScript 的字符串表示形式如下:

tell application "System Events"
  tell (process id [insert process id here]) to do script "this.preflight(Preflight.getProfileByName('Magazine Ads'),false,false);"
end tell

我怀疑NSRunningApplication 返回的processIdentifier 与“系统事件”使用的进程ID 不同,但我被卡住了,不知道从哪里进一步了解。我需要一个关于如何从 Cocoa 触发特定应用程序进程的 AppleScriptable 方法的指针,因为

  • 同一应用程序可以有多个实例在运行,并且
  • 我想与之通信的每个进程都将在我的代码范围内创建

(运行 Adob​​e Acrobat 的新进程对于允许用户在运行预检时执行其他工作是必要的。)


编辑:cocoa和AppleScript返回的进程id不同:

tell application "System Events" to set process_id to id of every process whose name contains "AdobeAcrobat"

返回 {5584211,…},同时

[NSRunningApplication processIdentifier]

返回 8722


编辑 2:AppleEvent 对象确实可以处理具有特定进程 ID 的进程,但我无法弄清楚如何将其应用于 AppleScript 对象。

pid_t process_id = …; 
NSAppleEventDescriptor* appleevent = [[NSAppleEventDescriptor alloc] initWithDescriptorType:typeKernelProcessID bytes:&process_id length:sizeof(pid)];

我还没有弄清楚如何使用NSAppleEventDescriptor 访问具有给定process_id 的进程的AppleScriptable 方法。任何指向资源的指针和可能的例子都可以完美地回答我的问题。

【问题讨论】:

    标签: objective-c cocoa applescript appleevents


    【解决方案1】:

    这不起作用,因为此命令适用于 Acrobat

    当您想要模拟(单击或键盘)、获取或设置(值、属性或属性)过程的“GUI 元素”时,您必须使用Processes suite 命令(“系统事件”)。

    这里是使用命令do script的语法

    tell application id "process.id.here" to do script "this.preflight(Preflight.getProfileByName('Magazine Ads'),false,false);"
    

    编辑: 我认为这是捆绑标识符。 无法通过“系统事件”执行do script。 但是,如果您在应用程序的菜单中有此脚本,这是可能的。 你需要找到正确的应用ID,试试unix ID

    要做你想做的事,把应用程序放在前台并运行脚本

    using terms from application "Adobe Acrobat"
        tell application (path to frontmost application)
            do script "this.preflight(Preflight.getProfileByName('Magazine Ads'),false,false);"
        end tell
    end using terms from
    

    流程套件:这是一个单击菜单的示例脚本。

    tell application "System Events"
        tell (first process whose unix id is (processIdHere as integer))
            set frontmost to true
            click menu item "Crop to TrimBox*" of menu "Document" of menu bar 1
        end tell
    end tell
    

    【讨论】:

    • 我要触发的事件在 Adob​​e Acrobat Pro 的 AppleScript 字典中,它们在应用程序的 GUI 中不可用。您建议的行不适用于可可或系统事件返回的进程 ID(请编辑我的原始问题)。你能详细说明我如何使用Processes suite 命令来做我想做的事吗?
    • 不幸的是,GUI 脚本不会让我访问 AppleScriptable 方法,因为它们不能通过菜单直接访问,并且在执行脚本时计算机也将被人使用,所以更改最前面的应用程序将不起作用。
    • 获取 unix id 是前进的一步,但由于我试图从 Cocoa 访问方法,也许有比使用 AppleScript 编译 tell 语句更直接的方法?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多