【发布时间】: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 方法的指针,因为
- 同一应用程序可以有多个实例在运行,并且
- 我想与之通信的每个进程都将在我的代码范围内创建
(运行 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: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