Cocoa脚本:如何使用AppleScript处理程序(事件)?

Cocoa脚本:如何使用AppleScript处理程序(事件)?,applescript,cocoa-scripting,Applescript,Cocoa Scripting,将脚本能力添加到我的Mac应用程序中,我想知道是否可以从我的应用程序调用脚本端的处理程序。如果是这样的话,这是如何工作的 据我所知,处理程序类似于函数(如“运行时”),可以由脚本自身代码之外的事件调用。Sdef文件理解event标记,因为我可以使用。但是我在Cocoa脚本指南中找不到任何关于这方面的文档 我的应用程序记录了剪贴板,所以我想知道是否可以让正在运行的脚本知道已记录了新的剪贴板,以便脚本可以对其进行操作 现在,与其调用我为此类事件定位、加载和运行的单独(独立)脚本,不如让用户持续运行一

将脚本能力添加到我的Mac应用程序中,我想知道是否可以从我的应用程序调用脚本端的处理程序。如果是这样的话,这是如何工作的

据我所知,处理程序类似于函数(如“运行时”),可以由脚本自身代码之外的事件调用。Sdef文件理解
event
标记,因为我可以使用。但是我在Cocoa脚本指南中找不到任何关于这方面的文档

我的应用程序记录了剪贴板,所以我想知道是否可以让正在运行的脚本知道已记录了新的剪贴板,以便脚本可以对其进行操作

现在,与其调用我为此类事件定位、加载和运行的单独(独立)脚本,不如让用户持续运行一个脚本,声明我的应用程序随后调用的事件。(这是否真的是一个好主意不应该在这里讨论,我只是用这个例子来理解AppleScript事件。)

可能吗?如果没有,sdef中的事件条目的用途是什么


更新:这里介绍了AppleScript中的处理程序:

实现AppleScript事件处理程序的困难在于应用程序必须具有对脚本的永久引用

例如,在Finder、Messages、Mail中处理事件处理程序的脚本必须在目标应用程序中注册,以保留对脚本的引用

当脚本实现其中一个提供的事件处理程序时,目标应用程序将使用

initWithEventClass:kHandlerEventClass 
           eventID:kEventID
  targetDescriptor:kEventTargetDescriptor 
          returnID:kAutoGenerateReturnID // predefined constant in CarbonCore.h
     transactionID:kAnyTransactionID]; // predefined constant in CarbonCore.h
包括参数的子描述符,并通过目标脚本引用上的
executeapleevent
发送

  • kEventID
    是sdef文件(“EfgH”)中8个字符代码的至少4个有效位
  • kHandlerEventClass
    是sdef文件(“abcD”)中8个字符代码的最高位
  • kEventTargetDescriptor
    是一个
    NSAppleEventDescriptor
    ,将客户端或目标应用程序表示为返回地址
事件处理程序的工作方式类似于命令,这里是一个非常基本的示例

<event name="did appear something" code="abcDEfgH" description="This handler is called when something appears.">
     <direct-parameter description="The names of the appeared something.">
        <type type="text" list="yes"/>
     </direct-parameter>
     <parameter name="with result" code="smTS" description="A record of some information about the names" type="something reply"/>
</event>
  • 名称
    是一个文本列表
  • theResult
    是一种自定义记录类型
    something reply

我已经能够通过使用硬编码的处理程序名称,调用通过NSAppleScript加载的脚本的处理程序。我想这是更干净的版本。我看了一个使用这些事件的消息脚本,我想我现在可以把它全部整合起来了。我想很多知识仍然来自Cocoa之前的脚本API和Mac内部,现在很难找到,因为苹果已经从服务器上删除了所有旧文档。似乎它们不再有用:)那么,你建议我如何管理脚本和我的应用程序之间的连接?我想我的应用程序必须选择(固定名称?)并加载脚本本身,然后使用其默认处理程序(“运行”)运行它,以使其启动并准备就绪?应用程序是否也应该监控mod日期戳,以便在其更改时重新加载?或者是因为脚本可能将其属性存储在其中而导致的,以这种方式重新加载时会导致问题?或者有没有一种方式可以让用户调用脚本,并且应用程序可以识别脚本并保持与脚本的连接?通过
NSAppleScript
运行脚本和将Apple事件发送到sdef文件中定义的处理程序是两件完全不同的事情。这取决于目标应用程序是否需要直接(单向)或使用类似于库的脚本(双向)通知脚本某个特定事件。还有第三种方法可以将
NSAppleScriptTask
与位于指定的
应用程序脚本
文件夹中的脚本一起使用。我无法理解您的答案。我知道NSAppleScript和NSAppleScript任务。我两者都用。后者总是运行默认处理程序(在运行时),而前者允许我通过executeAppleEvent调用其他处理程序。没问题。但这不是我想问的。抱歉说不清楚,但我不知道你是误解了我还是我误解了你。你回答的前两句话听起来更复杂了,因此我提出了后续问题。如果我只需要让用户选择一个脚本文件,然后用NSAppleScript加载它,那么这很简单。我刚刚回答了如何使用sdef文件中定义的AppleEvents的问题
NSAppleScript
是另外一种东西:它只用于运行脚本(从文本字符串源或从磁盘加载)
NSUserAppleScript Task
(我忘了
User
)与
NSAppleScript
非常相似–最大的区别在于,您无法从文本字符串编译和运行脚本,另一方面,您可以在沙盒应用程序中运行脚本,而不受任何限制和特定的Apple Events权限。
on did appear something theNames with result theResult