Objective c Cocoa和AppleScript/Apple活动

Objective c Cocoa和AppleScript/Apple活动,objective-c,cocoa,applescript,appleevents,Objective C,Cocoa,Applescript,Appleevents,我正在使用Cocoa的[[NSWorkspace sharedWorkspace]LaunchApplicationaURL…和NSWorkspaceLaunchNewInstance选项生成AppleScriptable应用程序(Adobe Acrobat)的新实例,我希望能够为每个实例触发不同的Apple事件(编写脚本、退出、保存等) 到目前为止,我已经尝试根据新进程的id应用脚本“系统事件”和告诉命令,但由于某些原因,这些命令没有被目标进程执行 我将进程id获取为[NSRunningApp

我正在使用Cocoa的
[[NSWorkspace sharedWorkspace]LaunchApplicationaURL…
NSWorkspaceLaunchNewInstance
选项生成AppleScriptable应用程序(Adobe Acrobat)的新实例,我希望能够为每个实例触发不同的Apple事件(编写脚本、退出、保存等)

到目前为止,我已经尝试根据新进程的id应用脚本“系统事件”和
告诉
命令,但由于某些原因,这些命令没有被目标进程执行

我将进程id获取为
[NSRunningApplication processIdentifier]
,并使用它通过
[[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方法的指针

  • 同一个应用程序可以有多个实例在运行和运行
  • 我想要与之通信的每个进程都将在我的代码范围内创建
(运行Adobe 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:AppleeEvent对象确实可以使用某个进程id对进程进行寻址,但我还没有弄清楚如何将其应用于AppleScript对象

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

我还没有弄清楚如何使用
NSAppleEventDescriptor
访问具有给定
进程id的进程的AppleScriptable方法。任何指向资源的指针以及可能的示例都是我问题的完美答案。

这不起作用,因为此命令用于Acrobat> 当您想要模拟(单击或键盘)、获取或设置(值、属性或属性)流程的GUI元素时,必须使用
流程套件
命令(“系统事件”)

下面是使用命令
do脚本的语法

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

编辑: 我以为是包标识符。 无法通过“系统事件””执行
do脚本。
但是,如果您在应用程序的菜单中有这个脚本,这是可能的。
您需要找到正确的应用程序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

我要触发的事件在Adobe Acrobat Pro的AppleScript字典中,它们在应用程序的GUI中不可用。您建议的行与cocoa或System events返回的进程id都不起作用(请编辑我的原始问题)。您能详细说明我如何使用
Process suite
命令来完成我想要的任务吗?不幸的是,GUI脚本无法让我访问AppleScriptable方法,因为它们无法通过菜单直接访问,而且在执行scrips时,计算机也会被人使用,因此更改frontmost应用程序将无法工作。获取unix id是前进的一步,但由于我正在尝试从Cocoa访问这些方法,也许有比使用AppleScript编译tell语句更直接的方法?